2008-09-30 19 views

Trả lời

202

Gọi ActiveRecord::ConnectionAdapters::SchemaStatements#tables. Phương pháp này không có giấy tờ trong bộ điều hợp MySQL, nhưng được ghi lại trong bộ điều hợp PostgreSQL. SQLite/SQLite3 cũng có phương thức được triển khai, nhưng không có giấy tờ.

>> ActiveRecord::Base.connection.tables 
=> ["accounts", "assets", ...] 

Xem activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb:21, cũng như việc triển khai ở đây:

+1

Danh sách cũng bao gồm bảng 'schema_migrations'. Chỉ cần biết. Cảm ơn :) – imechemi

0

Không biết về hồ sơ hoạt động, nhưng đây là một câu hỏi đơn giản:

chọn tên_bảng từ INFORMATION_SCHEMA.TABLES nơi TABLE_TYPE = 'CƠ SỞ TABLE'

2

Dường như không nên có một cách tốt hơn , nhưng đây là cách tôi giải quyết vấn đề của mình:

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 

Mã này giả định rằng bạn đang tuân theo quy ước đặt tên chuẩn cho các lớp và tệp mã nguồn.

13

Dựa trên hai câu trả lời trước đó, bạn có thể làm:

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 

để liệt kê mọi mô hình tóm tắt bảng, với số lượng bản ghi.

+1

cho những người cuồng tín đơn dòng (không có sự bảo mật bổ sung của bảng regex): (ActiveRecord :: Base.connection.tables - ['schema_migrations']). Map {| t | "# {t.classify} có # {t.classify.constantize.count} bản ghi"} –

+1

Tại sao bạn sử dụng regex tại đây? Sẽ không "tiếp theo nếu table == 'schema_migrations'" cũng hoạt động không? – tbreier

Các vấn đề liên quan