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


Answers:


259

致电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和此处的实现:


2
该列表还包括schema_migrations表。请注意。谢谢:)
imechemi

ActiveRecord :: Base.connection可能已弃用?apidock.com/rails/ActiveRecord/Base/connection 我没有在其中看到ActiveRecord :: Base.connection.tables。
barlop

20

根据前面的两个答案,您可以执行以下操作:

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

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


1
对于单行狂热分子(不增加正则表达式表匹配项的安全性):(ActiveRecord :: Base.connection.tables-['schema_migrations'])。map {| t | “#{t.classify}有#{t.classify.constantize.count}条记录”}
Sascha Kaestle 2014年

1
为什么在这里使用正则表达式?“如果表=='schema_migrations',则继续下一步”是否同样有效?
tbreier

12

Rails 5.2的更新

对于Rails 5.2,您还可以使用ApplicationRecord来获取Array表名称。只是,作为imechemi提到的,要知道,这种方法也将返回ar_internal_metadataschema_migrations数组英寸

ApplicationRecord.connection.tables

1

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

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

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


2
它还假设您的app / models /中的所有内容都是活动记录模型
localhostdotdev

0

不知道活动记录,但这是一个简单的查询:

从INFORMATION_SCHEMA中选择table_name.Tables,其中TABLE_TYPE ='BASE TABLE'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.