使用ActiveModel :: Serializer如何为每个模型

时间:2015-12-13 20:39:17

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

我希望为每个模型返回的JSON包含一个表属性,表示对象来自的数据库表(STI,它不是与模型类相同),并查找相应的工厂函数来实例化对象。

我想我可以手动覆盖每个序列化程序的表属性,但这看起来真的很难看。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:2)

这很有效。

让我的所有序列化程序继承以下内容:

class ApplicationSerializer < ActiveModel::Serializer

  attributes :table_name

  def table_name
      object.class.table_name
  end
end

答案 1 :(得分:0)

一个好的解决方案是扩展ActiveRecord::Base,覆盖attributes方法,然后使用继承。

扩展ActiveRecord::Base和覆盖。

class ActiveRecordExtension < ActiveRecord::Base
    self.abstract_class = true

    def attributes
        res = super
        res["class_name"] = class_name
        res 
    end

    def class_name
        self.class.name
    end
end

<强>继承

class User < ActiveRecordExtension
end

你也可以创建一个猴子补丁,但继承更整洁。在猴子补丁中唯一有用的是你不会将继承从ActiveRecord::Base更改为另一个类。

我没有使用ActiveModel::Serializer,但如果你坚持使用它,你可以了解更多信息in this cast虽然我猜每个模型都需要一个与我的解决方案形成对比的序列化器。