จะแสดงรายการตารางทั้งหมดที่กำหนดไว้สำหรับฐานข้อมูลเมื่อใช้ Active record ได้อย่างไร?


126

ฉันจะรับรายการตารางทั้งหมดที่กำหนดไว้สำหรับฐานข้อมูลเมื่อใช้ Active record ได้อย่างไร

คำตอบ:


259

โทร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และการใช้งานที่นี่:


2
รายการยังรวมถึงschema_migrationsตาราง เพียงแค่ตระหนัก ขอบคุณ :)
imechemi

ActiveRecord :: Base.connection อาจเลิกใช้งาน? apidock.com/rails/ActiveRecord/Base/connection ฉันไม่เห็น ActiveRecord :: Base.connection.tables อยู่ในรายการ
barlop

20

จากสองคำตอบก่อนหน้านี้คุณสามารถทำได้:

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

เพื่อแสดงทุกโมเดลที่เป็นนามธรรมตารางพร้อมจำนวนเรกคอร์ด


1
สำหรับผู้คลั่งไคล้บรรทัดเดียว (ไม่มีการรักษาความปลอดภัยเพิ่มเติมของการจับคู่ตาราง regex): (ActiveRecord :: Base.connection.tables - ['schema_migrations']) แผนที่ {| t | "# {t.classify} มี # {t.classify.constantize.count} บันทึก"}
Sascha Kaestle

1
ทำไมคุณถึงใช้ regex ที่นี่? "next if table == 'schema_migrations'" จะไม่ทำงานเช่นกันหรือ
tbreier

12

การอัปเดตสำหรับRails 5.2

สำหรับ Rails 5.2 คุณสามารถใช้ApplicationRecordเพื่อรับArrayชื่อตารางของคุณได้ เช่นเดียวกับที่กล่าวถึง imechemi โปรดทราบว่าวิธีนี้จะส่งกลับar_internal_metadataและschema_migrationsในอาร์เรย์นั้นด้วย

ApplicationRecord.connection.tables

1

ดูเหมือนว่าจะมีวิธีที่ดีกว่านี้ แต่ฉันแก้ไขปัญหาได้อย่างไร:

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

โค้ดนี้ถือว่าคุณกำลังทำตามหลักการตั้งชื่อโมเดลมาตรฐานสำหรับคลาสและไฟล์ซอร์สโค้ด


2
นอกจากนี้ยังถือว่าทุกอย่างในแอป / รุ่นของคุณ / เป็นโมเดลบันทึกที่ใช้งานอยู่
localhostdotdev

0

ไม่รู้เกี่ยวกับ Active record แต่นี่คือคำค้นหาง่ายๆ:

เลือก table_name จาก INFORMATION_SCHEMA ตารางที่ TABLE_TYPE = 'BASE TABLE'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.