我在试图建立一个JSON表示的一些轨道模型的使用活动的模式程序,其中一些模型嵌入他人。例如,我有事件和与会者的事件has_and_belongs_to_many与会者。

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' }] }.

现在,我想添加什么的与会者都表示对该事件。让我们说,评论belongs_to事件,belongs_to与会者。我想包括上述评论意见中所列化的输出的事件,那它会成为 { name: 'Event One', attendees: [{ name: 'Alice', comments: [{ text: 'Event One was great!'}] }, { name: 'Bob', comments: [] }] }.

我可能有

class AttendeeSerializer < ActiveModel::Serializer
  attributes :name

  has_many :comments
end

但是,将选择的所有意见通过该参与者所有活动-不是我想要的。我想写这一点,但我怎么发现的特定事件我在做化?我可以以某种方式访问'父母'的对象,或者也许通过选择一个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

是这个东西可以做到的,或者我应该刚刚建立id在另一个方式对于这个特定的使用情况?

有帮助吗?

解决方案

我做的东西动手动得到控制:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top