Ruby on rails 3 RoR:MyModel.Descents在第一次调用后在视图中返回[]?

Ruby on rails 3 RoR:MyModel.Descents在第一次调用后在视图中返回[]?,ruby-on-rails-3,activerecord,Ruby On Rails 3,Activerecord,我想在视图中显示MyModel子类的选择列表。它还不起作用,所以为了检查是否正常,我在我的视图中包含了以下内容: <%= MyModel.descendants %> 。。。我已经证实他们是被要求的 @($%&是怎么回事?当您使用require时,即使您的my_model.rb被重新加载,内核也不需要您的子类.rb文件,因为它们已经被加载。您必须通过rails自动加载 基本上,根据您的第一个请求,rails会自动从my_model.rb加载MyModel,然后需要my_models

我想在视图中显示MyModel子类的选择列表。它还不起作用,所以为了检查是否正常,我在我的视图中包含了以下内容:

<%= MyModel.descendants %>
。。。我已经证实他们是被要求的


@($%&是怎么回事?

当您使用require时,即使您的
my_model.rb
被重新加载,内核也不需要您的子类
.rb
文件,因为它们已经被加载。您必须通过rails自动加载

基本上,根据您的第一个请求,rails会自动从
my_model.rb
加载
MyModel
,然后需要
my_models/sub_model.rb
SubModel
类继承
MyModel
,从而填充
子体
数组。 但是,在您的以下请求中,rails会再次自动加载
MyModel
(嘿,您处于开发模式),然后需要再次加载
myu models/sub\u model.rb
。但是这次,内核知道它已经加载了这个文件,不会再加载它

一小时前我遇到了这个问题,这让我找到了你的帖子,并找到了一个解决方案。我们需要的是rails在每次调用主类时自动加载子类

以下是一个解决方案:

class MyModel
  Dir[File.join(File.dirname(__FILE__),"my_models","*.rb")].each do |f|
    MyModels.const_get(File.basename(f,'.rb').classify)
  end
end

这些行可能放在类外。如果您只有
my_models
中的文件,而没有子目录中的文件,那就足够了(对我来说)。如果您有一些(例如
MyModels::Car::Ford
,您可能需要在子模块(在
my_models/Car.rb
)中放置相同的内容.

我也遇到了同样的问题。通过添加一个
config/initializers/preload_models.rb
解决了这个问题:

Dir[Rails.root + 'app/models/*.rb'].map {|f| File.basename(f, '.*').camelize.constantize }

希望这对其他人有所帮助。

我刚刚在每个环境中启用了渴望加载:

config.eager\u load=true


即使在使用名称空间作为类名时,这对我来说也是有效的。

+1可以清楚地解释正在发生的事情——谢谢。不幸的是,我的子类有“首字母缩略词”名称,如“PGEService”使用像“pge_service.rb”这样的文件名。我还没有准备好将我的文件重命名为“p_g_e_service.rb”-至少还没有!如果您的文件名为PGEService.rb,您可以只使用文件名(不使用
.classify
),但如果仍然是
pge_service.rb
,我看不到任何简单的解决方案。当然,除非你做一些类似
s=File.basename(f,.rb').split(“');class_name=s.first.upcase+s.last.classify;MyModels.const_get(class_name)
。是的,我知道有点难看。严格地说,你确实回答了我的问题“发生了什么?”.所以你应该打勾。我已经改进了我的问题,但我会把它作为一个单独的问题发布。接下来!实际上我对模型中的代码做了一些更改,因为加载子类时我会得到错误的东西:如果我在
MyModel
尚未加载时加载
SubModel
,Rails会在
classsubmodel
行,它需要加载
MyModel
,这反过来需要我的子模型文件…无限循环。解决方案是直接将上面的代码片段放在后代方法中。这帮助了我…谢谢!几分钟后,当通过初始值设定项加载时,它仍然会从内存中消失。这似乎对我的namespa有效ced模型:
Dir[Rails.root+'app/models/***/.rb'].map{f|File.path(f).to_.sub(Rails.root.to_.s+'/app/models/','').chomp('.rb').camelize.constantize if!File.path(f).to_.include?('/concerns/'))
,虽然我不确定排除关注点是否意味着应该加载的模型没有加载。这在我目前的情况下不是问题。我认为这将是一个成功的答案。其他人是否可以验证这一点?这是一个误报,它会工作几分钟,然后内存就会耗尽。无论您使用此功能的页面是什么-只要足够刷新,
子类
子类
最终将再次返回空白。
Dir[Rails.root + 'app/models/*.rb'].map {|f| File.basename(f, '.*').camelize.constantize }