2009-11-05 12 views
24

मैं एक प्लगइन मैं लिख रहा हूँ के लिए एक प्रवास जनरेटर लिख रहा हूँ और मैं क्या अद्वितीय अनुक्रमित एक मेज तो मैं एक समग्र अद्वितीय सूचकांक बनने के लिए मौजूदा अद्वितीय अनुक्रमणिका को संशोधित कर सकते है खोजने के लिए सक्षम होना चाहिए। मैं ActiveRecord के साथ तालिका में मौजूद इंडेक्स को एक्सेस करने का तरीका खोजने का प्रयास कर रहा हूं। मैं केवल ActiveRecord :: ConnectionAdapters :: PostgreSQLAdapter :: अनुक्रमित विधि को खोजने के लिए सक्षम किया गया है, लेकिन दुर्भाग्य से इस PosgreSQLAdapter के लिए ही उपलब्ध है। मुझे अन्य प्रमुख डेटाबेस का समर्थन करने में सक्षम होना चाहिए।ActiveRecord खोजने मौजूदा तालिका अनुक्रमित

मैं पहली बार schema.rb फ़ाइल grepping अनुक्रमित लगाने के लिए, यह पहली बार में काम किया, लेकिन मैं जल्द ही महसूस किया कि यह एक बुरा रणनीति थी।

मैं सोच रहा था कि यदि ActiveRecord एकाधिक डेटाबेस एडेप्टर के लिए ऐसा करने में सक्षम होने का माध्यम प्रदान नहीं करता है, तो मैं तालिका से अनुक्रमणिका जानकारी पुनर्प्राप्त करने के लिए एडाप्टर विशिष्ट क्वेरी लिखने में सक्षम हो सकता हूं। मैं इस विधि का सहारा लेना की जरूरत है क्या उपयोग में एडाप्टर निर्धारित करने के लिए एक अच्छा तरीका हो सकता है?

कोई ActiveRecord तालिका सूचकांक जानकारी है कि आदर्श होगा सूचीबद्ध करने के लिए पाने के लिए एक तरीका है जानता है।

+1

एक ही रास्ता मैं अभी ऐसा करने के लिए सोच सकते हैं की मदद से है ActiveRecord :: SchemaDumper.dump समस्या यह है कि इस $ stdout के लिए वर्तमान स्कीमा उदासीनता और मुझे लगता है कि कब्जा करने के लिए पता नहीं कैसे और है आउटपुट को एक स्ट्रिंग में कनवर्ट करें। तो मुझे लगता है कि पता था, मैं schema.rb पढ़ने का मेरा पहला दृष्टिकोण से कोड का उपयोग करने में सक्षम होगा। किसी को भी पता है कि ब्लॉक में लिखे गए किसी चीज़ के लिए $ stdout कैप्चर कैसे करें? उदाहरण के लिए यह काम नहीं करता है: schema_str = IO :: open (2) {ActiveRecord :: SchemaDumper.dump} .read –

+0

मुझे एहसास है कि यह प्रश्न प्राचीन है, लेकिन मेरे पास स्कीमाडम्पर को डंप करने की कोशिश करने का एक ही मुद्दा था एक स्ट्रिंग। मुझे अंततः उत्तर मिला, और अगर किसी और के पास यह समस्या है तो मैं इसे पोस्ट करूंगा: 'schema_rb_as_string = ActiveRecord :: SchemaDumper.dump (ActiveRecord :: Base.connection, StringIO.new) .स्ट्रिंग – MothOnMars

उत्तर

54

यह MySQL, sqlite3, और Postgres साथ काम करता है:

ActiveRecord::Base.connection.tables.each do |table| 
    puts ActiveRecord::Base.connection.indexes(table).inspect 
end 

लेकिन मुझे लगता है कि यह केवल आप अनुक्रमित आप विशेष रूप से बनाई गई देता है।

इसके अलावा, पता लगाने के लिए जो एडाप्टर उपयोग में है:

ActiveRecord::Base.connection.class 
+0

पोस्टग्रेज़ के साथ भी काम करता है – nikola

+0

यहां लिंक है: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html#method-i-indexes – Juguang

12

बस एक क्लीनर निरीक्षण के लिए अद्यतन। चूंकि मेरे पास कई तालिकाओं थीं इसलिए मुझे विशिष्ट सामानों की खोज करना मुश्किल हो रहा था।

ActiveRecord::Base.connection.tables.each do |table| 
    indexes = ActiveRecord::Base.connection.indexes(table) 
    if indexes.length > 0 
    puts "====> #{table} <====" 
    indexes.each do |ind| 
     puts "----> #{ind.name}" 
    end 
    puts "====> #{table} <====" 
    2.times{ puts ''} 
    end 
end 

यह त्वरित सेटअप होगा।

+1

यह एक अच्छा जवाब है। स्वीकृत प्रतिक्रिया से अधिक क्लीनर। – Lorenz

+0

यह बहुत अच्छा था, धन्यवाद! – Aeramor

संबंधित मुद्दे