首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >默认inheritance_column名称在ActiveRecord中

默认inheritance_column名称在ActiveRecord中
EN

Stack Overflow用户
提问于 2013-12-23 13:59:48
回答 2查看 1.3K关注 0票数 0

我试图更改所有模型的默认inheritance_column:

代码语言:javascript
复制
# 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没有得到它,但是子类得到了!

代码语言:javascript
复制
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" 

那么,我应该如何纠正这个问题以使它对基类有效呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-26 19:59:11

究其原因,是因为Rails 3.2.11中的方法ActiveRecord::Base.inheritance_column的定义低于我所使用的:

代码语言:javascript
复制
def inheritance_column
  if self == Base
    'type' # Note this!
  else
    (@inheritance_column ||= nil) || superclass.inheritance_column
  end
end

深入研究Rails提交历史,我发现半年前有人也有同样的问题,并编写了一个补丁,允许全局重写继承列名--欢迎开放源代码!

它现在包含在3.2和4.0分支中。如果我经常升级我的宝石,我就不会有麻烦了。

发生在我身上的另一件事是,我不必要地用一个模块修补ActiveRecord,一个初始化器就足够了:

代码语言:javascript
复制
# config/initializers/default_sti.rb
ActiveRecord::Base.send(:inheritance_column=, 'runtime_class')
票数 1
EN

Stack Overflow用户

发布于 2013-12-23 14:07:29

那么在全球范围内改变它呢:

代码语言:javascript
复制
ActiveRecord::Base.inheritance_column = 'runtime_class'

或者在每一种模式中:

代码语言:javascript
复制
class Class
  self.inheritance_column = :runtime_class
  ...
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20745078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档