この質問は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
を使用しません。
私の質問:
これは本当にエレガントではありませんが、機能しているようです:
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
次のようなことを試してみたらどうでしょう。
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
アクティブモデルシリアライザーでは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
だからあなたはできる:
class UserCombinationSerializer < ActiveModel::Serializer
attributes :id
belongs_to :stage, serializer: StageSerializer
belongs_to :subject, serializer: SubjectSerializer
end