是否有一种方法可以获得Rails应用程序中所有模型的集合?
基本上,我能做的是:-
Models.each do |model|
puts model.class.name
end
是否有一种方法可以获得Rails应用程序中所有模型的集合?
基本上,我能做的是:-
Models.each do |model|
puts model.class.name
end
当前回答
def load_models_in_development
if Rails.env == "development"
load_models_for(Rails.root)
Rails.application.railties.engines.each do |r|
load_models_for(r.root)
end
end
end
def load_models_for(root)
Dir.glob("#{root}/app/models/**/*.rb") do |model_path|
begin
require model_path
rescue
# ignore
end
end
end
其他回答
我认为@hnovick的解决方案是一个很酷的,如果你没有表的模型。这个解决方案也可以在开发模式下工作
但我的方法略有不同
ActiveRecord::Base.connection.tables.map{|x|x.classify.safe_constantize}.compact
分类应该能从字符串中正确地给出类名。safe_constantise确保您可以安全地将其转换为类,而不会抛出异常。如果您的数据库表不是模型,则需要这样做。紧凑,以便删除枚举中的任何nil。
ActiveRecord::Base.connection.tables.map do |model|
model.capitalize.singularize.camelize
end
将返回
["Article", "MenuItem", "Post", "ZebraStripePerson"]
附加信息如果你想在对象名上调用一个没有model:string未知方法或变量错误的方法,使用这个
model.classify.constantize.attribute_names
这似乎对我很管用:
Dir.glob(RAILS_ROOT + '/app/models/*.rb').each { |file| require file }
@models = Object.subclasses_of(ActiveRecord::Base)
Rails只在使用模型时加载模型,因此Dir。Glob行“需要”models目录中的所有文件。
一旦你在数组中有了模型,你可以做你想做的事情(例如在视图代码中):
<% @models.each do |v| %>
<li><%= h v.to_s %></li>
<% end %>
如果有人觉得这个例子有用,我就随便举个例子。解决方案是基于这个答案https://stackoverflow.com/a/10712838/473040。
假设您有一个列public_uid,它被用作外部世界的主ID(您可以在这里找到为什么要这样做的原因)
现在假设您已经在一些现有的model上引入了这个字段,现在您想要重新生成所有尚未设置的记录。你可以这样做
# lib/tasks/data_integirity.rake
namespace :di do
namespace :public_uids do
desc "Data Integrity: genereate public_uid for any model record that doesn't have value of public_uid"
task generate: :environment do
Rails.application.eager_load!
ActiveRecord::Base
.descendants
.select {|f| f.attribute_names.include?("public_uid") }
.each do |m|
m.where(public_uid: nil).each { |mi| puts "Generating public_uid for #{m}#id #{mi.id}"; mi.generate_public_uid; mi.save }
end
end
end
end
现在可以运行rake di:public_uid:generate
我还不能评论,但我认为sj26的答案应该是首要答案。提示一下:
Rails.application.eager_load! unless Rails.configuration.cache_classes
ActiveRecord::Base.descendants