【问题标题】:Rails serialize heir classRails 序列化继承者类
【发布时间】:2014-10-21 03:00:51
【问题描述】:

如何指定要序列化从抽象类继承的附加属性? (我正在使用 ActiveModel::Serializer)

编辑:我需要在序列化程序中保留关联/引用,而不仅仅是属性

class AbstractClass
    [attributes]
    **has_one :reference** # Added after Edit
end

class Foo < AbstractClass
    field :some_special_foo_field
end

class Bar < AbstractClass
    field :some_other_bar_field
end

Class Baz
   has_many :abstract_class
end

我想要一个看起来像这样的 JSON

{:baz => [
    { id => "foo_1_ID",
      some_special_foo_field => "something"
    }, {
      id => "bar_1_ID,
      some_other_bar_field => "Somewhere"
}]

我正在控制器中的某个地方:

@bazz = Baz.all
respond_to do |format|
    format.json { render json: @bazz}
end

class BazSerializer < ActiveModel::Serializer
    attributes [what I need]
    has_many :constraints, serializer: AbstractClassShortSerializer, embed: :objects
end

class AbstractClassSerializer
    **has_one :reference, serializer: SomethingSerializer, embed: :objects** # Added after Edit
    attributes :[attributes I want to keep]
end

现在的问题:根据@bazz 中的对象是 Foo 还是 Bar,我想在我的 JSON 中包含它们的特殊属性,但我目前无法使用此代码

这个问题与Simulating constraints and sub-constraints这个问题有些联系

【问题讨论】:

    标签: ruby-on-rails json inheritance serialization attributes


    【解决方案1】:

    简单点:

    • 为 foos 做一个序列化程序,为 bar 做一个序列化程序
    • 不要在baz 序列化程序中使用has_many

    这样做:

    class AbstractClassShortSerializer < ActiveModel::Serializer
      attributes common_attributes_here
    end
    
    class BarSerializer < AbstractClassShortSerializer
    
    end
    
    class BazSerializer < ActiveModel::Serializer
      attributes [what I need]
      attributes :constraints
    
      def constraints
        object.constraints.map do |constraint|
          if constraint.foo?
            FooSerializer
          elsif constraint.baz?
            BazSerializer
          else
            AbstractClassShortSerializer
          end.new(constraint, scope: scope).attributes
        end
      end
    

    结束

    【讨论】:

    • 谢谢。我不知道我可以使用这个技巧。但我仍然觉得它可以以更短的方式完成。这里的问题是我需要一个特定的AbstractClassShortSerializer。在我的应用程序的其他地方,我正在使用AbstractClass 的默认 rails 序列化程序,它已经在 J​​SON 中输出了特定的 foo&bar 属性。
    • 你也可以通过在序列化程序中覆盖attributes来做到这一点,但它不太清楚
    • 那么问题是,如果稍后在我的代码中添加其他继承自 AbstractClass 的类,我将不得不每次更改此序列化程序。
    • 这意味着每次你有不同的子类型时,它都需要自己的序列化器,这听起来并不荒谬
    • 是的,但是有没有办法默认选择默认的序列化程序? else {constraint.class.default_serializer} 之类的东西?
    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多