使用 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
我希望为每个模型返回的 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