Tengo un raro modelo de datos de la situación de partida, así que tal vez todo mi enfoque es erróneo. Esto es lo que yo estoy haciendo:

Tengo una clase llamada Pájaro y una clase simple llamada Color. Conceptualmente, cada pájaro tiene dos to_many asociaciones de Color, uno para hombres de colores y otro para mujeres de colores. La manera en la que he manejado esto es el uso de un modelo de join llamado BirdColoration que pertenece a un pájaro y un color y tiene un campo booleano para indicar si la coloración es para hombre o mujer. Para cada ave, en realidad tiene un to_many relación a BirdColoration así como un to_many de Color :a través de BirdColoration. Si esto suena razonable, entonces siga leyendo. De lo contrario, parar y decirme por qué está mal!

Tengo que ser capaz de volcar las aves tabla como json. Anteriormente, cuando cada ave que sólo había uno to_many asociación a los colores, yo sólo podría utilizar :include para incluir cada uno de pájaro de colores en el json de volcado. Ahora, estoy incluyendo la BirdColorations en el vertedero, pero aún me falta para llegar a los modelos de color a sí mismos. Me podría por separado incluyen cada uno de pájaro de colores y tonalidades y, a continuación, ponerlos durante el análisis, pero me gustaría mucho más, simplemente, incluir cada una coloración de color directamente. Algo así como

      format.json  { render :json => @birds.to_json(:include => [{:bird_colorations => :color}, :seasons, :habitats, :image_holders]) }

Lo anterior no funciona, sin embargo. Creo que esto debería ser posible. Puede alguien me apunte en la dirección correcta de cómo manejar esto?

Por ahora, sólo voy a incluir cada uno de pájaro de color y coloraciones por separado y ponerlos en el análisis. Al menos sé que va a funcionar.

Gracias!

InformationsquelleAutor CharlieMezak | 2010-12-14

2 Comentarios

  1. 51

    He encontrado la respuesta aquí. La sintaxis para la :opción incluir en to_xml y to_json es diferente que el de ActiveRecord del método de búsqueda. Para incluir recursos anidados de esta manera, se pasa en un hash en lugar de una matriz. El método correcto de llamada para mí se parece a:

          format.json  { render :json => @birds.to_json(:include => {:bird_colorations => {:include => :color}, :seasons => {}, :habitats => {}, :image_holders => {}}) }

    Comparar a la de mi pregunta para ver la diferencia. De los recursos para los que no desea incluir sub-recursos, acaba de pasar un hash vacío como el valor de lo que se simboliza nombre.

    Vive y aprende!

    • Me gustaría votar más por esto!! Gracias!
    • yo también @brutuscat. Salvado el pellejo!
    • El código en tu pregunta se ve mucho más limpio, esto es tan contrario a la intuición. Especialmente porque si usted no tiene la bird_colorations de anidación de color, las preguntas de ejemplo de trabajo. Gracias por publicar la solución. Los rieles deben solucionar este problema…
  2. 2

    Si usted tiene una compleja estructura JSON, es mejor reemplazar serializable_hash o as_json en el modelo que tratar de hacer todo a través de render :json.

    Algo así como

    def serializable_hash(options = nil)
      options ||= {}
      bird = {:name => name, ...}
      bird[:seasons] = seasons.serilizable_hash
      bird[:colors] = ... # whatever complex logic you want to get to the colors
      bird
    end

    Ambas funciones sólo tiene que devolver un valor hash.

    • Gracias! Voy a echar un vistazo a esto. Si estoy contento con el resultado que estoy obteniendo de render :json, ¿hay alguna otra razón para reemplazar los métodos (rendimiento, tal vez)? Todas las otras cosas siendo iguales, mi instinto es dejar que el construido en la funcionalidad de tomar el cuidado de las cosas para mí.
    • No creo que usted va a obtener un aumento del rendimiento debido a procesar llamadas json as_json/serializable_hash en el fondo. Es sólo una buena filosofía de diseño llamado «fat modelos, delgada controladores,» la mayoría de la elegante discutido aquí: stackoverflow.com/questions/2550376/…

Dejar respuesta

Please enter your comment!
Please enter your name here