使用 ActiveModel::Serializer 如何为每个模型添加 table 属性

Using ActiveModel::Serializer How Can I Add a table attribute to each model

我希望为每个模型返回的 JSON 包含一个 table 属性,指示数据库 table 对象来自(对于 STI,这与模型不同class) 并查找适当的工厂函数来实例化对象。

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

一个好的解决方案是扩展 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 更改为另一个 class.

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

这行得通。

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

class ApplicationSerializer < ActiveModel::Serializer

  attributes :table_name

  def table_name
      object.class.table_name
  end
end