我试图更改所有模型的默认inheritance_column:
# lib/change_sti_column.rb
module ChangeSTIColumn
def self.included(base)
base.class_eval do
self.inheritance_column = 'runtime_class'
end
end
end
ActiveRecord::Base.send(:include, ChangeSTIColumn)看来ActiveRecord::Base没有得到它,但是子类得到了!
1.9.3-p484 :005 > ActiveRecord::Base.inheritance_column
=> "type"
1.9.3-p484 :005 > SubclassOfAR.inheritance_column
=> "type"
1.9.3-p484 :009 > SubclassOfAR.send(:include, ChangeSTIColumn).inheritance_column
=> "runtime_class" 那么,我应该如何纠正这个问题以使它对基类有效呢?
发布于 2013-12-26 19:59:11
究其原因,是因为Rails 3.2.11中的方法ActiveRecord::Base.inheritance_column的定义低于我所使用的:
def inheritance_column
if self == Base
'type' # Note this!
else
(@inheritance_column ||= nil) || superclass.inheritance_column
end
end深入研究Rails提交历史,我发现半年前有人也有同样的问题,并编写了一个补丁,允许全局重写继承列名--欢迎开放源代码!
它现在包含在3.2和4.0分支中。如果我经常升级我的宝石,我就不会有麻烦了。
发生在我身上的另一件事是,我不必要地用一个模块修补ActiveRecord,一个初始化器就足够了:
# config/initializers/default_sti.rb
ActiveRecord::Base.send(:inheritance_column=, 'runtime_class')发布于 2013-12-23 14:07:29
那么在全球范围内改变它呢:
ActiveRecord::Base.inheritance_column = 'runtime_class'或者在每一种模式中:
class Class
self.inheritance_column = :runtime_class
...
endhttps://stackoverflow.com/questions/20745078
复制相似问题