我遇到了一个问题,我正在使用 as_json 方法,以及如何有效地返回 JSON 中的对象以及它的 belongs_to 对象作为 JSON,其中 belongs_to 对象有它自己的 belongs_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 中获取所有属性,但没有从 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
在第二个设置中,我得到了我想要的所有消息的嵌套属性。
我的问题是,我是否缺少一些 Rails 约定来正确执行此操作?似乎会有/应该有更简单的方法。