सक्रिय रिकॉर्ड का उपयोग करते समय मुझे डेटाबेस के लिए परिभाषित सभी तालिकाओं की एक सूची कैसे मिलती है?
सक्रिय रिकॉर्ड का उपयोग करते समय मुझे डेटाबेस के लिए परिभाषित सभी तालिकाओं की एक सूची कैसे मिलती है?
जवाबों:
पुकारते हैं ActiveRecord::ConnectionAdapters::SchemaStatements#tables। यह विधि MySQL एडॉप्टर में अनडायरेक्ट की गई है, लेकिन पोस्टग्रेक्यूएल एडॉप्टर में प्रलेखित है। 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
रिकॉर्ड्स की संख्या के साथ तालिका को सार करने वाले हर मॉडल को सूचीबद्ध करने के लिए।
रेल 5.2 के लिए एक अद्यतन
रेल 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
यह कोड मानता है कि आप कक्षाओं और स्रोत कोड फ़ाइलों के लिए मानक मॉडल नामकरण सम्मेलनों का पालन कर रहे हैं।
schema_migrationsतालिका भी शामिल है। बस जागरूक रहिए। धन्यवाद :)