【发布时间】:2015-12-13 20:39:17
【问题描述】:
我希望为每个模型返回的 JSON 包含一个表属性,指示对象来自的数据库表(对于 STI,这与模型类不同)并查找适当的工厂函数以实例化对象。
我想我可以手动覆盖每个序列化程序的表属性,但这看起来真的很难看。一般有什么办法可以做到吗?
【问题讨论】:
标签: ruby-on-rails json active-model-serializers
我希望为每个模型返回的 JSON 包含一个表属性,指示对象来自的数据库表(对于 STI,这与模型类不同)并查找适当的工厂函数以实例化对象。
我想我可以手动覆盖每个序列化程序的表属性,但这看起来真的很难看。一般有什么办法可以做到吗?
【问题讨论】:
标签: ruby-on-rails json active-model-serializers
这行得通。
让我所有的序列化程序都继承自以下:
class ApplicationSerializer < ActiveModel::Serializer
attributes :table_name
def table_name
object.class.table_name
end
end
【讨论】:
一个好的解决方案是扩展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,尽管我猜每个模型都需要一个序列化程序,而我的解决方案是。
【讨论】: