是否有一种方法可以获得Rails应用程序中所有模型的集合?
基本上,我能做的是:-
Models.each do |model|
puts model.class.name
end
是否有一种方法可以获得Rails应用程序中所有模型的集合?
基本上,我能做的是:-
Models.each do |model|
puts model.class.name
end
当前回答
在Rails 6中,Zetiwerk成为默认的代码加载器。
对于快速加载,请尝试:
Zeitwerk::Loader.eager_load_all
Then
ApplicationRecord.descendants
其他回答
ActiveRecord:美国:基地connection。表
这似乎对我很管用:
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 %>
这对我很管用。特别感谢上面所有的帖子。这将返回所有模型的集合。
models = []
Dir.glob("#{Rails.root}/app/models/**/*.rb") do |model_path|
temp = model_path.split(/\/models\//)
models.push temp.last.gsub(/\.rb$/, '').camelize.constantize rescue nil
end
万一有人无意中发现了这个问题,我有另一个解决方案,不依赖于dir读取或扩展Class类……
ActiveRecord::Base.send :subclasses
这将返回一个类数组。所以你可以这样做
ActiveRecord::Base.send(:subclasses).map(&:name)
可以检查一下
@models = ActiveRecord::Base.connection.tables.collect{|t| t.underscore.singularize.camelize}