是否有一种方法可以获得Rails应用程序中所有模型的集合?
基本上,我能做的是:-
Models.each do |model|
puts model.class.name
end
是否有一种方法可以获得Rails应用程序中所有模型的集合?
基本上,我能做的是:-
Models.each do |model|
puts model.class.name
end
当前回答
Rails5的模型现在是ApplicationRecord的子类,所以要获得应用程序中所有模型的列表,你需要:
ApplicationRecord.descendants.collect { |type| type.name }
或更短:
ApplicationRecord.descendants.collect(&:name)
如果你在开发模式下,你需要在以下情况之前加载模型:
Rails.application.eager_load!
其他回答
ActiveRecord::Base.connection.tables.map do |model|
model.capitalize.singularize.camelize
end
将返回
["Article", "MenuItem", "Post", "ZebraStripePerson"]
附加信息如果你想在对象名上调用一个没有model:string未知方法或变量错误的方法,使用这个
model.classify.constantize.attribute_names
我在Rails 4中尝试了很多这样的答案,但都没有成功(哇,看在上帝的份上,他们改变了一两件事),所以我决定添加我自己的答案。调用ActiveRecord::Base的那些。连接和拉表名工作,但没有得到我想要的结果,因为我隐藏了一些模型(在app/models/内的文件夹中),我不想删除:
def list_models
Dir.glob("#{Rails.root}/app/models/*.rb").map{|x| x.split("/").last.split(".").first.camelize}
end
我把它放在初始化式中,可以在任何地方调用它。防止不必要的鼠标使用。
Rails5的模型现在是ApplicationRecord的子类,所以要获得应用程序中所有模型的列表,你需要:
ApplicationRecord.descendants.collect { |type| type.name }
或更短:
ApplicationRecord.descendants.collect(&:name)
如果你在开发模式下,你需要在以下情况之前加载模型:
Rails.application.eager_load!
以下是一个经过复杂Rails应用程序(支持Square的应用程序)审查的解决方案
def all_models
# must eager load all the classes...
Dir.glob("#{RAILS_ROOT}/app/models/**/*.rb") do |model_path|
begin
require model_path
rescue
# ignore
end
end
# simply return them
ActiveRecord::Base.send(:subclasses)
end
它采用了这篇文章中最好的答案,并将它们组合成最简单、最彻底的解决方案。当你的模型在子目录中时,可以使用set_table_name等。
ActiveRecord:美国:基地connection。表