Cómo enviar el padre/hijo de Rails al front-end JS para que sea accesible como un objeto anidado

En backend, mi relación de objeto es que un archivo Item 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 útil gongema. 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 enviarlos de vuelta Item.ally, en la parte delantera, obtener una matriz de elementos con cada elemento como un hash que representa sus atributos exactamente como quiero. .

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.

Answer

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.