serializers rails new custom as_json active ruby-on-rails active-model-serializers

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:

  1. ¿No debería ser capaz de usar una relación de relación de pertenencia en el serializador?
  2. 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

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

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