我希望为每个模型返回的JSON包含一个表属性,表示对象来自的数据库表(STI,它不是与模型类相同),并查找相应的工厂函数来实例化对象。
我想我可以手动覆盖每个序列化程序的表属性,但这看起来真的很难看。有没有办法做到这一点?
答案 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虽然我猜每个模型都需要一个与我的解决方案形成对比的序列化器。