ruby-on-rails - active - ruby on rails fast json
RoR anidado: incluir para incluir sub-recursos en to_xml/to_json (2)
Encontré la respuesta here . La sintaxis de la opción: include en to_xml y to_json es diferente a la del método de búsqueda de ActiveRecord. Para incluir recursos anidados de esta manera, se pasa un hash en lugar de una matriz. El método correcto para mi llamada se ve así:
format.json { render :json => @birds.to_json(:include => {:bird_colorations => {:include => :color}, :seasons => {}, :habitats => {}, :image_holders => {}}) }
Compara con el de mi pregunta para ver la diferencia. Para los recursos para los cuales no desea incluir sub-recursos, simplemente pase un hash vacío como valor para su nombre simbolizado.
¡Vive y aprende!
Tengo una situación de modelo de datos extraña para empezar, así que tal vez mi enfoque completo sea incorrecto. Esto es lo que estoy haciendo:
Tengo una clase llamada Bird y una clase simple llamada Color. Conceptualmente, cada ave tiene dos asociaciones entre muchos colores, una para los colores masculinos y otra para los colores femeninos. La forma en que lo he manejado es usar un modelo de unión llamado BirdColoration que pertenece a un ave y un color y tiene un campo booleano adicional para determinar si la coloración es masculina o femenina. Así que cada pájaro en realidad tiene una relación de muchos con BirdColoration, así como muchos con Color: a través de BirdColoration. Si esto suena razonable, entonces continúa leyendo. De lo contrario, detente y dime por qué está mal!
Necesito poder volcar la mesa de los pájaros como json. Anteriormente, cuando cada ave solo tenía una asociación entre muchos colores, podía usar: incluir para incluir los colores de cada ave en el volcado de json. Ahora, estoy incluyendo BirdColorations en el basurero, pero aún necesito llegar a los modelos de color. Podría incluir por separado los colores y las coloraciones de cada ave y luego combinarlos mientras analizaba, pero preferiría simplemente incluir el color de cada coloración directamente. Algo 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. ¿Alguien puede indicarme la dirección correcta para manejar esto?
Por ahora, solo incluiré el color y el color de cada ave por separado y los combinaré en el análisis. Al menos sé que funcionará.
¡Gracias!
Si tiene una estructura JSON compleja, es mejor anular serializable_hash
o as_json
en su modelo que intentar hacerlo todo a través de render :json
.
Entonces algo 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 solo necesitan devolver un hash.