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

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

调用ActiveRecord::ConnectionAdapters::SchemaStatements#tables 。 这个方法在MySQL适配器中没有logging,但在PostgreSQL适配器中有logging。 SQLite / SQLite3也有实现的方法,但没有logging。

 >> 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

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

 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 

列出抽象表的每个模型,logging的数量。

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

 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 

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

不知道有效的logging,但这是一个简单的查询:

从INFORMATION_SCHEMA.Tables中selecttable_name,其中TABLE_TYPE ='BASE TABLE'