Me encuentro con un problema donde estoy trabajando con el método as_json, y cómo devolver el objeto eficientemente en JSON Y es también un objeto como JSON, donde el objeto belongs_to tiene su propio objeto belongs_to. El código probablemente lo explicaría mejor.Rails as_json issue - Cómo incluir objetos anidados de manera eficiente?
El No-Trabajo Camino clase
Alerta
class Alert < ActiveRecord::Base
belongs_to :message
# for json rendering
def as_json(options={})
super(:include => :message)
end
end
clase Message
def as_json(options={})
super(methods: [:timestamp, :num_photos, :first_photo_url, :tag_names],
include: { camera: { only: [:id, :name] },
position: { only: [:id, :name, :address, :default_threat_level ]},
images: { only: [:id, :photo_url, :is_hidden]} })
end
El problema con esta configurar primero es que cuando tengo un objeto Alerta y llame al
alert.as_json()
me sale todos los atributos de Alerta y todos los atributos de mensaje, pero ninguno de los otros atributos de mensaje que yo quiero, al igual que la cámara, posición, etc.
Aquí está la "Está funcionando, pero probablemente no es correcto diseño Way"
Alerta Clase
class Alert < ActiveRecord::Base
belongs_to :message
# for json rendering
def as_json(options={})
super().merge(:message => message.as_json)
end
end
Mensajes Clase
# for json rendering
def as_json(options={})
super(methods: [:timestamp, :num_photos, :first_photo_url, :tag_names])
.merge(:camera => camera.as_json)
.merge(:position => position.as_json)
.merge(:images => images.as_json)
end
En esta segunda configuración, obtengo todos los atributos anidados de Messages como yo quiero.
Mi pregunta, ¿me falta alguna Convención de Rails para hacer esto correctamente? Parece que debería/debería haber una manera más fácil.
Bueno, parece que lo arreglaron con la solicitud de extracción, pero nunca sacaron en una versión.Gracias por el enlace, aclaro algunos problemas. – bluedevil2k
Para el registro, lo que obtuve de esa RP es: 1) trato de usar una gema específica para la api json (prefiero los serializadores de modelo activo) 2) Si no quiere/no puede hacer eso, anule 'serialized_hash 'en lugar de' as_json' en todos sus modelos. Simplemente reemplace 'as_json' por' serialized_hash'. Sus modelos generarán correctamente las dependencias incluidas. – kikito
gracias kikito, corrección menor, es 'serializable_hash' – trans1t