ฉันจะรับรายการตารางทั้งหมดที่กำหนดไว้สำหรับฐานข้อมูลเมื่อใช้ Active record ได้อย่างไร
ฉันจะรับรายการตารางทั้งหมดที่กำหนดไว้สำหรับฐานข้อมูลเมื่อใช้ Active record ได้อย่างไร
คำตอบ:
โทร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
และการใช้งานที่นี่:
จากสองคำตอบก่อนหน้านี้คุณสามารถทำได้:
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
เพื่อแสดงทุกโมเดลที่เป็นนามธรรมตารางพร้อมจำนวนเรกคอร์ด
การอัปเดตสำหรับRails 5.2
สำหรับ Rails 5.2 คุณสามารถใช้ApplicationRecord
เพื่อรับArray
ชื่อตารางของคุณได้ เช่นเดียวกับที่กล่าวถึง imechemi โปรดทราบว่าวิธีนี้จะส่งกลับar_internal_metadata
และschema_migrations
ในอาร์เรย์นั้นด้วย
ApplicationRecord.connection.tables
ดูเหมือนว่าจะมีวิธีที่ดีกว่านี้ แต่ฉันแก้ไขปัญหาได้อย่างไร:
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
โค้ดนี้ถือว่าคุณกำลังทำตามหลักการตั้งชื่อโมเดลมาตรฐานสำหรับคลาสและไฟล์ซอร์สโค้ด
ไม่รู้เกี่ยวกับ Active record แต่นี่คือคำค้นหาง่ายๆ:
เลือก table_name จาก INFORMATION_SCHEMA ตารางที่ TABLE_TYPE = 'BASE TABLE'
schema_migrations
ตาราง เพียงแค่ตระหนัก ขอบคุณ :)