質問

Modelsが他のモデルを埋め込むアクティブモデルシリアライザを使用して、いくつかのRailsモデルのJSON表現を構築しようとしています。たとえば、イベントと出席者、イベントHAS_AND_BELONGS_TO_TO_MANY出席者があります。

class EventSerializer < ActiveModel::Serializer
  attributes :name

  has_many :attendees, serializer: AttendeeSerializer
end

class AttendeeSerializer < ActiveModel::Serializer
  attributes :name
end
.

これはJSONのような{ name: 'Event One', attendees: [{ name: 'Alice' }, { name: 'Bob' }] }をもたらすでしょう。

今、出席者がイベントについて言ったことを追加したいのですが。言って、コメントがbense_toイベント、bense_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
.

これはできること、あるいはこの特定のユースケースのために別の方法でJSONを構築するだけであるべきですか?

役に立ちましたか?

解決

手動でコントロールを取得するために物事をやることができます:

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