web-dev-qa-db-ja.com

アクティブモデルシリアライザーbelongs_to

この質問はAMS 0.8に関係します

私は2つのモデルを持っています:

class Subject < ActiveRecord::Base
  has_many :user_combinations
  has_ancestry
end

class UserCombination < ActiveRecord::Base
  belongs_to :stage
  belongs_to :subject
  belongs_to :user
end

そして2つのシリアライザー:

class UserCombinationSerializer < ActiveModel::Serializer
      attributes :id
      belongs_to :stage
      belongs_to :subject
end

class SubjectSerializer < ActiveModel::Serializer
  attributes :id, :name, :description, :subjects

  def include_subjects?
    object.is_root?
  end

  def subjects
    object.subtree
  end
end

UserCombinationがシリアル化されるとき、サブジェクトのサブツリー全体を埋め込みたいです。

この設定を使用しようとすると、次のエラーが発生します。

undefined method `belongs_to' for UserCombinationSerializer:Class

UserCombinationSerializerを次のように変更してみました。

class UserCombinationSerializer < ActiveModel::Serializer
  attributes :id, :subject, :stage
end

この場合、エラーは発生しませんが、subjectは間違った方法でシリアル化されます-SubjectSerializerを使用しません。

私の質問:

  1. シリアライザでbelongs_toリレーションを使用できませんか?
  2. そうでない場合-どのようにして必要な動作を取得できますか-SubjectSerializerを使用して件名ツリーを埋め込みますか?
26
Jesper

これは本当にエレガントではありませんが、機能しているようです:

class UserCombinationSerializer < ActiveModel::Serializer
  attributes :id, :stage_id, :subject_id

  has_one :subject
end

has_oneを呼び出すのはあまり好きではありませんが、実際にはbelongs_to関連付けです:/

編集:has_one/belongs_toのあいまいさに関する私のコメントは無視してください。ドキュメントは実際にはかなり明確です: http://www.rubydoc.info/github/Rails-api/active_model_serializers/frames

40
pjam

次のようなことを試してみたらどうでしょう。

class UserCombinationSerializer < ActiveModel::Serializer
  attributes :subject,
             :stage,
             :id

  def subject
    SubjectSerializer.new(object.subject, { root: false } )
  end

  def stage
    StageSerializer.new(object.stage, { root: false } )
  end
end
3
heriberto perez

アクティブモデルシリアライザーでは0-10-stable、belongs_to 現在利用できます。

belongs_to :author, serializer: AuthorPreviewSerializer
belongs_to :author, key: :writer
belongs_to :post
belongs_to :blog
def blog
  Blog.new(id: 999, name: 'Custom blog')
end

https://github.com/Rails-api/active_model_serializers/blob/0-10-stable/docs/general/serializers.md#belongs_to

だからあなたはできる:

class UserCombinationSerializer < ActiveModel::Serializer
  attributes :id
  belongs_to :stage, serializer: StageSerializer
  belongs_to :subject, serializer: SubjectSerializer
end
2
MicFin