是否有一种方法可以获得Rails应用程序中所有模型的集合?
基本上,我能做的是:-
Models.each do |model|
puts model.class.name
end
是否有一种方法可以获得Rails应用程序中所有模型的集合?
基本上,我能做的是:-
Models.each do |model|
puts model.class.name
end
当前回答
Module.constants.select { |c| (eval c).is_a?(Class) && (eval c) < ActiveRecord::Base }
其他回答
Module.constants.select { |c| (eval c).is_a?(Class) && (eval c) < ActiveRecord::Base }
ActiveRecord:美国:基地connection。表
我寻找了很多方法,最后选择了这种方式:
in the controller:
@data_tables = ActiveRecord::Base.connection.tables
in the view:
<% @data_tables.each do |dt| %>
<br>
<%= dt %>
<% end %>
<br>
来源:http://portfo.li/rails/348561-how-can-one-list-all-database-tables-from-one-project
Rails 3、4和5的完整答案是:
如果cache_classes是关闭的(在开发中默认是关闭的,但在生产中是打开的):
Rails.application.eager_load!
然后:
ActiveRecord::Base.descendants
这将确保加载应用程序中的所有模型,无论它们位于何处,并且也加载了您使用的任何提供模型的gem。
这应该也适用于从ActiveRecord::Base继承的类,如Rails 5中的ApplicationRecord,并只返回后代的子树:
ApplicationRecord.descendants
如果您想了解更多关于这是如何完成的,请查看ActiveSupport:: descent stracker。
我还不能评论,但我认为sj26的答案应该是首要答案。提示一下:
Rails.application.eager_load! unless Rails.configuration.cache_classes
ActiveRecord::Base.descendants