轨活动的模式程序-has_many和访问的父记录
-
20-12-2019 - |
题
我在试图建立一个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
不隶属于 StackOverflow