En backend, mi relación de objeto es que un Item
tiene has_many
Options
. Me gustaría poder acceder a todos los atributos del elemento y sus opciones secundarias como un hash en la interfaz:
items = [ { id: 1, item_attribute_name: item_attribute_value, options: [ {id: 1, option_attribute_name: option_attribute_value}, {id: 2, option_attribute_name: option_attribute_value}, ] }, { id: 2, item_attribute_name: item_attribute_value, options: [] } ]
Estoy enviando datos a través de un objeto json en respuesta a una solicitud de ajax o usando la práctica gema gon
. Me di cuenta de que si SOLO estaba interesado en enviar los elementos principales, el formato se realiza automáticamente de tal manera que puedo devolver Item.all
y, en la parte delantera, obtener una matriz de elementos con cada elemento como un hash que representa exactamente sus atributos. como yo quiera.
Pero si quiero enviar a los niños, ¿hay una forma estándar de hacerlo? Me doy cuenta de que puedo construir los atributos del niño como se muestra a continuación, pero me pregunto si hay una forma más directa y directa.
Cómo haría que esto funcione construyendo los atributos secundarios:
items = Item.all items.each do |i| child_attr = {"options" => i.options } i.attributes.merge(child_attr) end
Una respuesta totalmente aceptable, por cierto, es que no hay... una forma automágica de hacer esto sin hacer lo que estoy haciendo ahora, que es convertir cada objeto principal en atributos en el backend y luego unir los atributos secundarios.
Solo hago esta pregunta, francamente, porque sería bueno mantener las relaciones de objetos en el backend para reutilizarlas en otro lugar, si es posible, en lugar de convertir las cosas en un hash.
Creo que la única forma de obtener el resultado esperado es con algunos parches de mono. Por lo tanto, puede usar un serializador, incluir o usar ActiveModel::Serializers::JSON, que se incluye de forma predeterminada en sus modelos.
Por ejemplo, con ActiveModel::Serializers::JSON, puede hacer algo como:
items = Item.all items.map! do |i| i.serializable_hash(include: { options: {} }) end
Esto se debe a la carga ansiosa de Rails, que evita tener que cargar todos los niños de una asociación (has_many, por ejemplo). Donde le gustaría serializar depende de su caso de uso.