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

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Rails as_json问题 – 如何有效地包括嵌套对象?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在遇到一个问题,我正在使用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.它至少可以使您以更优雅的方式解决您的问题.

猜你在找的Ruby相关文章