2016-01-15 4 views
2

Я использую ActiveModel :: Serializer в моем приложении rails-api. У меня есть полиморфная ассоциация под название addonable:active_model_serializers association as:

class AddOn < ActiveRecord::Base 
    belongs_to :addonable, polymorphic: true 
end 
class Container < ActiveRecord::Base 
    has_many :add_ons, as: :addonable 
end 
class Depot < ActiveRecord::Base 
    has_many :add_ons, as: :addonable 
end 

Тогда, у меня есть два различных контроллеров, каждый из них возвращает другой addonable (контейнер или депо). Я хотел бы сериалайзер вернуть addonable ассоциацию с именем класса:

class DepotSelectSerializer < ActiveModel::Serializer 
    attributes :id, :quantity 

    belongs_to :addonable, serializer: DepotSerializer, polymorphic: true 
end 
#returns: {:data=>{:id=>:string, :type=>:string, :attributes=>{:quantity=>:integer}, :relationships=>{:addonable=>{:data=>:object}}}} 

#I want: {:data=>{:id=>:string, :type=>:string, :attributes=>{:quantity=>:integer}, :relationships=>{:depot=>{:data=>:object}}}} 

Я хочу, чтобы объект, чтобы быть в хэш-отношениях, а не в атрибутах, поэтому я не могу использовать пользовательский метод.

В идеале, я бы что-то вроде:

belongs_to :addonable, serializer: ContainerSerializer, polymorphic: true, as: :depot 

Но я не могу найти ничего подобного. Это возможно? Заранее спасибо

+0

Для тех, кто использует rails-api/active_model_serializers. Можно указать: ключ. Так что в моем случае это будет принадлежать_to: addonable, serializer: DepotSerializer, polymorphic: true, key:: depot – hcarreras

ответ

0

От active_model_serializerdocument, он описывает:

Вы также можете использовать: сериалайзер параметр, чтобы указать пользовательский класс сериализатора и: полиморфный вариант, чтобы указать ассоциацию, полиморфный (ИППП) , например:

has_many: комментарии,: сериализатору => CommentShortSerializer

has_one: рецензент: полиморфный => верно

Сериализаторы занимаются только множественностью, а не владением. attributes_to ActiveRecord ассоциации могут быть включены с использованием has_one в вашем сериализаторе.

Так что в вашем случае, давайте использовать has_one вместо belongs_to:

has_one :addonable, serializer: DepotSerializer, polymorphic: true 

испытано, это работает в моем проекте!

+0

Это все равно делает тот же результат, что и нежелательный. Объект находится под ключом: addonable. Я хочу это под ключ: депо. – hcarreras

+0

@dioshari: как насчет только определения атрибута: depot, он возвращает: addonable на самом деле? –

+0

Извините, я смутился. Я фактически использую rails-api/active_model_serializers. Таким образом, атрибуты находятся под другим ключом хеширования, чем ассоциации. Заглянув в правильную документацию, я просто увидел, что могу использовать: ключ для указания имени хэша. Спасибо за ваше время – hcarreras