首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Rails活动模型序列化程序- has_many和访问父记录

Rails活动模型序列化程序- has_many和访问父记录
EN

Stack Overflow用户
提问于 2014-07-29 15:51:48
回答 1查看 27.8K关注 0票数 19

我正在尝试使用Active Model Serializer构建一些Rails模型的JSON表示,其中一些模型嵌入了其他模型。例如,我有Event和Attendees、Event has_and_belongs_to_many Attendees。

代码语言:javascript
复制
class EventSerializer < ActiveModel::Serializer
  attributes :name

  has_many :attendees, serializer: AttendeeSerializer
end

class AttendeeSerializer < ActiveModel::Serializer
  attributes :name
end

这将产生类似于{ name: 'Event One', attendees: [{ name: 'Alice' }, { name: 'Bob' }] }的JSON。

现在,我想补充一下与会者对这次活动的看法。比方说,评论belongs_to事件,belongs_to Attendee。我希望将上述注释包含在event的序列化输出中,这样它就会变成{ name: 'Event One', attendees: [{ name: 'Alice', comments: [{ text: 'Event One was great!'}] }, { name: 'Bob', comments: [] }] }

我本可以

代码语言:javascript
复制
class AttendeeSerializer < ActiveModel::Serializer
  attributes :name

  has_many :comments
end

但这将为所有活动选择该与会者的所有评论-而不是我想要的。我想写这段代码,但是我如何找到我正在进行序列化的特定事件呢?我可以以某种方式访问“父”对象,或者将选项传递给has_many序列化程序吗?

代码语言:javascript
复制
class AttendeeSerializer < ActiveModel::Serializer
  attributes :name

  has_many :comments

  def comments
    object.comments.where(event_id: the_event_in_this_context.id)
  end
end

这是可以做到的吗,或者我应该为这个特定的用例以另一种方式构建JSON?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-29 16:12:41

我会手动做一些事情来获得控制权:

代码语言:javascript
复制
class EventSerializer < ActiveModel::Serializer
  attributes :name, :attendees

  def attendees
    object.attendees.map do |attendee|
      AttendeeSerializer.new(attendee, scope: scope, root: false, event: object)
    end
  end
end

class AttendeeSerializer < ActiveModel::Serializer
  attributes :name, :comments

  def comments
    object.comments.where(event_id: @options[:event].id).map do |comment|
      CommentSerializer.new(comment, scope: scope, root: false)
    end
  end
end
票数 53
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25010544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档