我正在遇到一个问题,我正在使用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,:tag_names]) .merge(:camera => camera.as_json) .merge(:position => position.as_json) .merge(:images => images.as_json) end
在第二个设置中,我收到了所有的消息的嵌套属性,就像我想要的.
我的问题是,我错过了一些Rails公约吗?似乎/应该是一个更简单的方法.
解决方法
你使用哪个版本的Rails?这是旧版本的Rails中的一个已知错误,据说是用
this pull request修复的.您的语法对我来说是正确的,所以也许这是你的问题?
除此之外,您还可能要从Jose Valim(Rails核心成员)核对新的active_model_serializers.它至少可以使您以更优雅的方式解决您的问题.