使用活动记录时,如何获取为数据库定义的所有表的列表?
答案 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'