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)
迭代“$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)
这有帮助吗?
| 归档时间: |
|
| 查看次数: |
3297 次 |
| 最近记录: |