使用活动记录时如何列出为数据库定义的所有表?

Jay*_*mel 121 activerecord

使用活动记录时,如何获取为数据库定义的所有表的列表?

Fra*_*eil 249

打电话ActiveRecord::ConnectionAdapters::SchemaStatements#tables.此方法在MySQL适配器中未记录,但在PostgreSQL适配器中有记录.SQLite/SQLite3也实现了该方法,但没有记录.

>> ActiveRecord::Base.connection.tables
=> ["accounts", "assets", ...]
Run Code Online (Sandbox Code Playgroud)

activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:21,以及这里的实现:

  • 该列表还包括`schema_migrations`表.请注意.谢谢 :) (2认同)

Tho*_*s E 16

基于前两个答案,您可以:

ActiveRecord::Base.connection.tables.each do |table|
  next if table.match(/\Aschema_migrations\Z/)
  klass = table.singularize.camelize.constantize      
  puts "#{klass.name} has #{klass.count} records"
end
Run Code Online (Sandbox Code Playgroud)

列出每个抽象表的模型,以及记录数.

  • 对于单行狂热者(没有增加正则表达式表匹配的安全性): (ActiveRecord::Base.connection.tables - ['schema_migrations']).map {|t| “#{t.classify} 有 #{t.classify.constantize.count} 条记录” } (2认同)

Hor*_*cio 11

Rails 5.2的更新

对于Rails 5.2,您还可以使用表格的名称ApplicationRecord来获取Array.就像imechemi提到的那样,请注意这个方法也将返回ar_internal_metadataschema_migrations在该数组中.

ApplicationRecord.connection.tables
Run Code Online (Sandbox Code Playgroud)