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

时间:2008-09-30 18:37:02

标签: activerecord

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

5 个答案:

答案 0 :(得分:237)

致电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以及此处的实施:

答案 1 :(得分: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

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

答案 2 :(得分:9)

  

Rails 5.2

的更新

对于Rails 5.2,您还可以使用ApplicationRecord来获得带有表名的Array。就像imechemi提到的那样,请注意,此方法还将在该数组中返回 ar_internal_metadata schema_migrations

ApplicationRecord.connection.tables

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:0)

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

选择table_name 来自INFORMATION_SCHEMA.Tables TABLE_TYPE ='BASE TABLE'