القضبان نموذج نشط المتسلسل-لديها الكثير والوصول إلى السجل الأصل

StackOverflow https://stackoverflow.com//questions/25010544

سؤال

أحاول بناء تمثيل جسون لبعض نماذج القضبان باستخدام نموذج نشط المسلسل ، حيث بعض النماذج تضمين الآخرين.على سبيل المثال ، لدي حدث وحضور ، والحدث _ و_ يمتد إلى_العديد من الحضور.

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top