active_model_serializers关联为:

时间:2016-01-15 13:43:38

标签: ruby-on-rails active-model-serializers rails-api

我在我的rails-api应用程序中使用ActiveModel :: Serializer。 我有一个名为addonable的多态关联:

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(Container或Depot)。 我希望序列化程序返回带有类名的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

但我找不到类似的东西。这可能吗? 提前致谢

1 个答案:

答案 0 :(得分:0)

来自active_model_serializer document,它描述了:

  

您还可以使用:serializer选项指定自定义序列化程序类,使用:polymorphic选项指定多态(STI)关联,例如:

     

has_many:comments,:serializer =&gt; CommentShortSerializer

     

has_one:reviewer,:polymorphic =&gt;真

     

序列化程序只关注多重性,而不是所有权。 belongs_to可以在序列化程序中使用has_one包含ActiveRecord关联。

因此,在您的情况下,请使用has_one代替belongs_to

has_one :addonable, serializer: DepotSerializer, polymorphic: true

经过测试,它适用于我的项目!