加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 21:41:44 所属栏目:百科 来源:网络整理
导读:我正在遇到一个问题,我正在使用as_json方法,以及如何有效地返回 JSON中的对象,它的belongs_to对象也是JSON,而belongs_to对象具有自己的belongs_to对象.代码可能会更好地解释. 不工作的方式 警戒类 class Alert ActiveRecord::Base belongs_to :message # for
我正在遇到一个问题,我正在使用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.它至少可以使您以更优雅的方式解决您的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读