如何遍历我的rails应用程序中的所有模型?

Jam*_*mes 9 metaprogramming ruby-on-rails models

我希望能够迭代并检查我的rails应用程序中的所有模型.在伪代码中,它看起来像:

rails_env.models.each do |model|  
  associations = model.reflect_on_all_associations(:has_many)  
  ... do some stuff  
end
Run Code Online (Sandbox Code Playgroud)

我的问题是如何检查我的rails应用程序以获取模型的集合(rails_env.models)?

小智 13

与nathanvda的响应类似,使用camelize而不是capitalize来支持带下划线的模型文件,并使用String#constantize而不是Kernel.const_get.

此外,如果您在模型文件夹中保留非主动记录模型(例如,用于合并搜索逻辑的搜索类),您将需要检查该类是否为活动记录模型.

Dir[Rails.root.join('app/models/*.rb').to_s].each do |filename|
  klass = File.basename(filename, '.rb').camelize.constantize
  next unless klass.ancestors.include?(ActiveRecord::Base)
  next if klass.abstract_class?
  # do something with klass
end
Run Code Online (Sandbox Code Playgroud)


nat*_*vda 2

迭代“$RAILS_ROOT\app\models”中的所有文件?

例如

def find_all_models
  # iterate over all files in folder
  folder = File.join(RAILS_ROOT, "app", "models")      
  Dir[File.join(folder, "*")].each do |filename|
    # remove .rb
    model_name = File.basename(filename).sub(/.rb$/, '').capitalize
    model = Kernel.const_get(model_name)
    # .. do something with your model :)
  end
end
Run Code Online (Sandbox Code Playgroud)

这有帮助吗?