У меня возникает проблема, когда я работаю с методом as_json и как эффективно возвращать объект в JSON. И он принадлежит объекту как JSON, а объект принадлежит этому объекту принадлежит свой object_to. Код, вероятно, объяснит это лучше.
Нерабочий путь
Класс предупреждения
class Alert < ActiveRecord::Base
belongs_to :message
# for json rendering
def as_json(options={})
super(:include => :message)
end
end
Класс сообщений
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
Проблема с этой первой настройкой заключается в том, что когда у меня есть объект Alert и вызывается
alert.as_json()
Я получаю все атрибуты из Alert и всех атрибутов из Message, но ни один из других атрибутов из сообщения, которое я хочу, например Camera, Position и т.д.
Здесь "Это работает, но, вероятно, не правильный путь дизайна"
Класс предупреждения
class Alert < ActiveRecord::Base
belongs_to :message
# for json rendering
def as_json(options={})
super().merge(:message => message.as_json)
end
end
Класс сообщений
# 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
В этой 2-й настройке я получаю все вложенные атрибуты сообщений, как я хочу.
Мой вопрос: я пропустил какую-то Rails-конвенцию, чтобы сделать это правильно? Похоже, что было бы/должно быть проще.