我正在尝试使用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
这将产生类似于{ 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: [] }] }
。
我本可以
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
这是可以做到的吗,或者我应该为这个特定的用例以另一种方式构建JSON?
发布于 2014-07-29 16:12:41
我会手动做一些事情来获得控制权:
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
https://stackoverflow.com/questions/25010544
复制相似问题