Làm thế nào để liệt kê tất cả các bảng được xác định cho cơ sở dữ liệu khi sử dụng bản ghi hoạt động?


126

Làm cách nào để có được danh sách tất cả các bảng được xác định cho cơ sở dữ liệu khi sử dụng bản ghi hoạt động?

Câu trả lời:


259

Gọi ActiveRecord::ConnectionAdapters::SchemaStatements#tables. Phương pháp này không có tài liệu 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ư các triển khai ở đây:


2
Danh sách này cũng bao gồm schema_migrationsbảng. Chỉ cần lưu ý. Cảm ơn :)
imechemi

ActiveRecord :: Base.connection có thể không được chấp nhận? apidock.com/rails/ActiveRecord/Base/connection Tôi không thấy ActiveRecord :: Base.connection.tables được liệt kê ở đó.
barlop

20

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 trừu tượng hóa một bảng, với số lượng các bản ghi.


1
đối với những người cuồng tín một dòng (không có bảo mật bổ sung của trận đấu bảng regex): (ActiveRecord :: Base.connection.tables - ['giản_migations']). map {| t | "# {t. classify} có # {t. classify.constantize.count} records"}
Sascha Kaestle

1
Tại sao bạn sử dụng regex ở đây? Sẽ không "tiếp theo nếu bảng == 'lược đồ_migations'" hoạt động tốt chứ?
viết tắt

12

Bản cập nhật cho Rails 5.2

Đối với Rails 5.2, bạn cũng có thể sử dụng ApplicationRecordđể lấy Arraytên của bảng. Như Imechemi đã đề cập, hãy lưu ý rằng phương thức này cũng sẽ quay trở lại ar_internal_metadataschema_migrationstrong mảng đó.

ApplicationRecord.connection.tables

1

Có vẻ như 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 các quy ước đặt tên mô hình chuẩn cho các lớp và tệp mã nguồn.


2
Nó cũng giả định mọi thứ trong ứng dụng / mô hình của bạn / là một mô hình bản ghi hoạt động
localhostdotdev

0

Không biết về bản ghi hoạt động, nhưng đây là một truy vấn đơn giản:

chọn tên_bảng từ Information_SCHema.Tables trong đó TABLE_TYPE = 'BASE TABLE'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.