我遇到了一個問題,我正在使用as_json方法,以及如何有效地返回JSON對象和它的belongs_to對象也是JSON,其中belongs_to對象具有自己的belongs_to對象。代碼可能會更好地解釋它。Rails as_json問題 - 如何高效地包含嵌套對象?
的未工作方式
Alert類
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.as_json()
我得到的所有來自警報的屬性和所有從郵件的屬性,但沒有從郵件,我想,像攝像頭,位置等
這裏的其他屬性的的「這是工作,但可能不合適的設計方法」
Alert類
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公約來正確地做到這一點?這似乎有/應該是一個更簡單的方法。
好吧,他們看起來像他們用拉請求修復它,但從來沒有把它拉到一個版本。感謝您的鏈接,它解決了一些問題。 – bluedevil2k 2012-04-26 21:04:05
爲了記錄,我從PR獲得的是:1)嘗試使用特定的gem作爲json api(我喜歡Active Model Serializer)2)如果你不想/不能這樣做,可以重寫'serialized_hash而不是所有模型中的'as_json'。用'serialized_hash'替換'as_json'。您的模型將正確呈現包含的依賴關係。 – kikito 2013-03-10 11:35:56
感謝kikito,輕微的更正,它是'serializable_hash' – trans1t 2015-08-23 06:08:17