ruby-on-rails - new - rails serializer nested
Serializadores de modelos activos pertenecen a (3)
Esta pregunta pertenece a AMS 0.8
Tengo dos modelos:
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
Y dos serializadores:
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
Cuando una UserCombination
se serializa, quiero incrustar todo el subárbol de temas.
Cuando trato de usar esta configuración me sale este error:
undefined method `belongs_to'' for UserCombinationSerializer:Class
Intenté cambiar el UserCombinationSerializer
a esto:
class UserCombinationSerializer < ActiveModel::Serializer
attributes :id, :subject, :stage
end
En este caso no recibo ningún error, pero el subject
se serializa de manera incorrecta, no utilizando el SubjectSerializer
.
Mis preguntas:
- ¿No debería ser capaz de usar una relación de relación de pertenencia en el serializador?
- Si no, ¿cómo puedo obtener el comportamiento deseado, incrustar el árbol de temas utilizando el SubjectSerializer?
¿Qué pasa si intentas con algo como esto?
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
En Active Model Serializer 0-10-stable, belongs_to
ya está disponible.
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
Para que pudieras hacer:
class UserCombinationSerializer < ActiveModel::Serializer
attributes :id
belongs_to :stage, serializer: StageSerializer
belongs_to :subject, serializer: SubjectSerializer
end
Esto no es realmente elegante pero parece estar funcionando:
class UserCombinationSerializer < ActiveModel::Serializer
attributes :id, :stage_id, :subject_id
has_one :subject
end
Realmente no me gusta llamar a has_one, mientras que en realidad es una asociación pertenece: a
EDITAR: Ignorar mi comentario sobre has_one / belongs_to ambiguity, el documento es bastante claro: http://www.rubydoc.info/github/rails-api/active_model_serializers/frames