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

Posted

技术标签:

【中文标题】使用活动记录时如何列出为数据库定义的所有表?【英文标题】:How to list of all the tables defined for the database when using active record? 【发布时间】:2010-09-14 08:08:25 【问题描述】:

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

【问题讨论】:

【参考方案1】:

致电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/lib/active_record/connection_adapters/mysql_adapter.rb:412 activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb:615 activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb:176

【讨论】:

该列表还包括schema_migrations 表。请注意。谢谢:) ActiveRecord::Base.connection 可能已被弃用? apidock.com/rails/ActiveRecord/Base/connection 我没有看到 ActiveRecord::Base.connection.tables 列在那里。【参考方案2】:

根据前两个答案,您可以这样做:

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

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

【讨论】:

对于单行***者(没有增加正则表达式表匹配的安全性):(ActiveRecord::Base.connection.tables - ['schema_migrations']).map |t| "#t.classify 有 #t.classify.constantize.count 条记录" 为什么在这里使用正则表达式? “next if table == 'schema_migrations'”不是也能正常工作吗?【参考方案3】:

Rails 5.2

的更新

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

ApplicationRecord.connection.tables

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

它还假设您的 app/models/ 中的所有内容都是活动记录模型【参考方案5】:

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

选择表名 来自 INFORMATION_SCHEMA.Tables 其中 TABLE_TYPE = '基表'

【讨论】:

以上是关于使用活动记录时如何列出为数据库定义的所有表?的主要内容,如果未能解决你的问题,请参考以下文章

如何存储历史数据[关闭]

无法在表视图中列出数据 [关闭]

如何在prolog中列出所有最小值

如何在返回活动中刷新返回的 amx 页面

如何修改mysql一个数据库中所有表某个字段的数据?

如何使用 Squirrel SQL 列出数据库中的所有表?