gpt4 book ai didi

ruby-on-rails - Rails as_json 问题 - 如何有效地包含嵌套对象?

转载 作者:数据小太阳 更新时间:2023-10-29 06:46:34 25 4
gpt4 key购买 nike

我遇到了一个问题,我正在使用 as_json 方法,以及如何有效地返回 JSON 中的对象 AND 它也是 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 约定来正确执行此操作?似乎会有/应该有更简单的方法。

最佳答案

对我来说最好的答案是使用 serializable_hash。 @kikito 在他的评论中提到了这一点,但有一个错字导致它无法工作。这不是serialized_hash,而是serializable_hash

从字面上看,只需找到并用 serializable_hash 替换 as_json,这个错误就会消失。 (它在今天的 Rails 4.0.2 中仍然没有修复)。您还可以在以后更轻松地实现 XML API(有些人仍在使用它们!)。

关于ruby-on-rails - Rails as_json 问题 - 如何有效地包含嵌套对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10340199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com