2013-12-23 42 views
0

我試圖更改默認inheritance_column我所有的車型:默認inheritance_column名的ActiveRecord

# 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" 

那麼我該如何糾正這個問題才能使它適用於基類呢?

回答

1

原來的原因是由於低於3.2 Rails的定義方法的ActiveRecord :: Base.inheritance_column的.11我正在使用:

def inheritance_column 
    if self == Base 
    'type' # Note this! 
    else 
    (@inheritance_column ||= nil) || superclass.inheritance_column 
    end 
end 

通過Rails挖掘commit history我發現了臨時t半年前,某人有同樣的問題,並承諾一個patch允許全局覆蓋繼承列名稱 - 歡迎來到開源!

它現在包含在3.2和4.0分支中。如果我更頻繁地升級我的寶石,我不會有麻煩。

是發生在我的另一件事是,我不必要的補丁的ActiveRecord一個模塊,一個初始化就足夠了:

# config/initializers/default_sti.rb 
ActiveRecord::Base.send(:inheritance_column=, 'runtime_class') 
1

什麼改變全球的它:

ActiveRecord::Base.inheritance_column = 'runtime_class' 

或者在每個模型:

class Class 
    self.inheritance_column = :runtime_class 
    ... 
end 
+0

的ActiveRecord :: Base.inheritance_column =「RUNTIME_CLASS」不起作用。當然,我可以很容易地將其設置在我需要的每個課程中,但我只是想知道是否可以在全球範圍內進行更改。 –