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

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

72304 次浏览

不了解活动记录,但有一个简单的查询:

Select table _ name 选择 table _ name 来自 INFORMATION _ SCHEMA. Tables 其中 TABLE _ TYPE = ‘ BASE TABLE’

似乎应该有更好的办法,但我是这样解决我的问题的:

Dir["app/models/*.rb"].each do |file_path|
require file_path # Make sure that the model has been loaded.


basename  = File.basename(file_path, File.extname(file_path))
clazz     = basename.camelize.constantize


clazz.find(:all).each do |rec|
# Important code here...
end
end

此代码假定您遵循类和源代码文件的标准模型命名约定。

呼叫 ActiveRecord::ConnectionAdapters::SchemaStatements#tables。此方法在 MySQL 适配器中没有文档说明,但在 PostgreSQL 适配器中有文档说明。SQLite/SQLite3也实现了该方法,但没有文档说明。

>> ActiveRecord::Base.connection.tables
=> ["accounts", "assets", ...]

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

基于以上两个答案,你可以这样做:

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

列出每个抽象表的模型,包括记录的数量。

Rails 5.2的更新

对于 Rails 5.2,您还可以使用 ApplicationRecord来获得带有表名的 Array。正如 imechemi 提到的,请注意这个方法也将在该数组中返回 ar_internal_metadataschema_migrations

ApplicationRecord.connection.tables

请记住,您可以通过调用以下命令从数组中删除 ar_internal_metadataschema_migrations:

ApplicationRecord.connection.tables - %w[ar_internal_metadata schema_migrations]