القضبان نموذج نشط المتسلسل-لديها الكثير والوصول إلى السجل الأصل
-
20-12-2019 - |
سؤال
أحاول بناء تمثيل جسون لبعض نماذج القضبان باستخدام نموذج نشط المسلسل ، حيث بعض النماذج تضمين الآخرين.على سبيل المثال ، لدي حدث وحضور ، والحدث _ و_ يمتد إلى_العديد من الحضور.
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' }] }
.
الآن ، أود أن أضيف ما قاله الحضور عن الحدث.دعنا نقول ، التعليق ينتمي إلى الحدث ، ينتمي إلى الحضور.أود تضمين التعليقات المذكورة في الإخراج المتسلسل للحدث ، لذلك سيصبح { 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
ولكن هذا من شأنه تحديد جميع التعليقات من قبل هذا الحضور لجميع الأحداث-وليس ما أريد.أود أن أكتب هذا, ولكن كيف يمكنني العثور على حدث معين الذي أفعله التسلسل?هل يمكنني الوصول بطريقة أو بأخرى إلى الكائن 'الأصل' ، أو ربما تمرير الخيارات إلى تسلسل هاس_العديد?
class AttendeeSerializer < ActiveModel::Serializer
attributes :name
has_many :comments
def comments
object.comments.where(event_id: the_event_in_this_context.id)
end
end
هل هذا شيء يمكن القيام به, أو يجب أن مجرد بناء جسون بطريقة أخرى لهذه الحالة استخدام معينة?
المحلول
كنت تفعل أشياء يدويا للحصول على السيطرة:
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