2014-03-06 67 views
0

所以我跟在他们一些ActiveRecord对象,而如果它的事项,是在一个单表继承层次结构中的宝石红宝石的宝石和地方对象覆盖

# gem 
class MySTIBaseClass < ActiveRecord::Base 
    # some code, does NOT implement a default_scope 
end 

当我在Rails应用程序试图定义一个default_scope

class MySTIBaseClass < ActiveRecord::Base 
    default_scope :order => "my_sti_bases.name ASC" 
end 
class MySTIOtherClass < MySTIBaseClass 
    # this is not in the gem, only in the rails application 
    scope :active, { where active: true } 
end 
MySTIOtherClass.active # order default scope is not applied 

然而,如果不是重新打开类我把代码中的初始化:

# initializer 
MySTIBaseClass.instance_eval do 
    default_scope :order => "my_sti_bases.name ASC" 
end 

# when the app is running 
MySTIOtherClass.active # default_scope is applied 

不过,我真的不能似乎明白了为什么是这种情况。看起来MySTIOtherClass.active在所有声明已经被评估之前都没有被调用,所以在应用程序中运行的类的版本应该能够全面了解所有声明的内容。有没有冲突的default_scopes,它是选择最后一个声明,所以它看起来像默认范围应该工作不管。

回答

1

的应用程序/型号目录设置为自动加载路径。这意味着如果它找不到符号,它只会需要该文件。根据你的情况,因为它是在创业板已定义的,自动加载永远不会触发,这就是为什么你没有得到default_scope

+0

Intereting!有没有办法强制轨道重新加载模型? – DVG

+0

你可以做这样的事情Dir.glob( “#{} Rails.root /应用/模型/ * RB”)sort.each {|。文件|初始化程序中的require_dependency file} – bridiver