Ruby-on-rails Rails Active Model Serializer - has_many 并访问父记录

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25010544/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 23:49:00  来源:igfitidea点击:

Rails Active Model Serializer - has_many and accessing the parent record

ruby-on-railsjsonactive-model-serializers

提问by Toms Mikoss

I'm trying to build a JSON representation of some Rails models using Active Model Serializer, where some models embed others. For example, I have Event and Attendees, Event has_and_belongs_to_many Attendees.

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

class EventSerializer < ActiveModel::Serializer
  attributes :name

  has_many :attendees, serializer: AttendeeSerializer
end

class AttendeeSerializer < ActiveModel::Serializer
  attributes :name
end

This would result in JSON like { name: 'Event One', attendees: [{ name: 'Alice' }, { name: 'Bob' }] }.

这将导致 JSON 之类的{ name: 'Event One', attendees: [{ name: 'Alice' }, { name: 'Bob' }] }.

Now, I'd like to add what the attendees have said about the event. Let's say, Comment belongs_to Event, belongs_to Attendee. I'd like to include said comments in the serialized output of event, so it would become { name: 'Event One', attendees: [{ name: 'Alice', comments: [{ text: 'Event One was great!'}] }, { name: 'Bob', comments: [] }] }.

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

I could have

我本可以有

class AttendeeSerializer < ActiveModel::Serializer
  attributes :name

  has_many :comments
end

but that would select all the comments by this attendee for all the events - not what I want. I'd like to write this, but how do I find the particular event for which I'm doing serialization? Can I somehow access the 'parent' object, or maybe pass options to a has_many serializer?

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

class AttendeeSerializer < ActiveModel::Serializer
  attributes :name

  has_many :comments

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

Is this something that can be done, or should I just build the JSON in another way for this particular use case?

这是可以完成的事情,还是我应该为此特定用例以另一种方式构建 JSON?

回答by apneadiving

I'd do things manually to get control:

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

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