सक्रिय रिकॉर्ड का उपयोग करते समय डेटाबेस के लिए परिभाषित सभी तालिकाओं की सूची कैसे करें?


126

सक्रिय रिकॉर्ड का उपयोग करते समय मुझे डेटाबेस के लिए परिभाषित सभी तालिकाओं की एक सूची कैसे मिलती है?

जवाबों:


259

पुकारते हैं ActiveRecord::ConnectionAdapters::SchemaStatements#tables। यह विधि MySQL एडॉप्टर में अनडायरेक्ट की गई है, लेकिन पोस्टग्रेक्यूएल एडॉप्टर में प्रलेखित है। 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 वहां सूचीबद्ध नहीं देखता।
बार्लॉप

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
सिंगल-लाइन कट्टरपंथियों (रेगेक्स टेबल मैच की अतिरिक्त सुरक्षा के बिना): (ActiveRecord :: Base.connection.tables - ['schema_migrations'])। map {| t | # "{t.classify} में # {t.classify.constantize.count} रिकॉर्ड्स"} हैं
साचा कास्ले जुले

1
आप यहां रेगेक्स का उपयोग क्यों करते हैं? "अगला नहीं होगा तो क्या टेबल == 'स्कीमा_मिग्रेशंस'" बस काम करेगा?
ट्रिबियर

12

रेल 5.2 के लिए एक अद्यतन

रेल 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
यह आपके ऐप / मॉडल में सब कुछ मानता है / एक सक्रिय रिकॉर्ड मॉडल है
लोकलहोस्टेडदेव

0

सक्रिय रिकॉर्ड के बारे में नहीं जानते, लेकिन यहाँ एक सरल प्रश्न है:

INFORMATION_SCHEMA.Tables से तालिका_नाम चुनें जहां TABLE_TYPE = 'आधार तालिका'

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.