2013-12-23 4 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

Оказалось, дело было обусловлено ниже определением метода ActiveRecord :: Base.inheritance_column в Rails 3.2 .11 что я использовал:

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

Копаем через Rails зафиксировать историю Я обнаружил, что 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» не работает. И конечно, я мог бы легко установить его в каждом классе, в котором я нуждаюсь, но мне просто интересно, можно ли изменить глобально. –

Смежные вопросы