gems中的Ruby对象和覆盖位置

gems中的Ruby对象和覆盖位置,ruby,gem,metaprogramming,Ruby,Gem,Metaprogramming,因此,我有一个gem,其中包含一些activerecord对象,如果有必要的话,它们位于一个表继承层次结构中 # gem class MySTIBaseClass < ActiveRecord::Base # some code, does NOT implement a default_scope end 然而,我似乎真的不明白为什么会这样。似乎在所有声明都被求值之前,MySTIOtherClass.active不会被调用,因此应用程序中运行的类的版本应该具有声明的所有内容的完整视

因此,我有一个gem,其中包含一些activerecord对象,如果有必要的话,它们位于一个表继承层次结构中

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

然而,我似乎真的不明白为什么会这样。似乎在所有声明都被求值之前,
MySTIOtherClass.active
不会被调用,因此应用程序中运行的类的版本应该具有声明的所有内容的完整视图。没有冲突的默认\u作用域,它正在选择最后一个声明的作用域,因此不管怎样,默认作用域都应该工作。

app/models目录被设置为自动加载路径。这意味着只有在找不到符号时才需要该文件。在您的情况下,因为它已经在gem中定义,自动加载将永远不会被触发,这就是为什么您没有得到默认的\u范围

Intereting!有没有办法强制rails重新加载模型?您可以在初始值设定项中执行如下操作:Dir.glob(“#{rails.root}/app/models/*.rb”).sort.each{124; file | require|dependency file}
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