2012-03-08 13 views
9

मैं एक उत्पादन डेटाबेस में एक इंडेक्स जोड़ना चाहता हूँ। सौभाग्य से हम पोस्टग्रेस चला रहे हैं, जो समवर्ती इंडेक्सिंग की अच्छी तरह से अनुमति देता है, इसलिए हम डाउनटाइम के बिना एक इंडेक्स जोड़ सकते हैं। कैच-समवर्ती इंडेक्स को लेनदेन के भीतर से जोड़ा नहीं जा सकता है, और रेल माइग्रेशन लेनदेन के अंदर सब कुछ लपेटता है।रेलवे को कैसे रोकें 3.1 लेनदेन में चलने से माइग्रेशन?

सौभाग्य से, ऐसा कुछ ऐसा है जो वास्तव में सरल समाधान की तरह दिखता है: ActiveRecord :: माइग्रेशन प्राइवेट विधि ddl_transaction को explained here के रूप में ओवरराइट करें।

class IndexUsersEmails < ActiveRecord::Migration 
    def ddl_transaction(&block) 
    block.call # do not start a transaction 
    end 

    def self.up 
    execute "CREATE INDEX CONCURRENTLY index_users_on_email ON users(email)" 
    end 
end 

समस्या यह है कि यह रेल 3.1 में काम नहीं कर रहा है। मैं ठीक करता हूं कि गिस्ट में कोड क्या करता है, और रेल पूरी तरह से इसे अनदेखा करते हैं। इस पर जाने के लिए कोई विचार है?

+0

आप विधि परिभाषा बदल रहा है इतना है कि यह एक वर्ग विधि है की कोशिश की? जैसे 'def self.ddl_transaction (& block) ... ' –

उत्तर

11

मैंने अभी देखा है कि मैंने कभी जवाब नहीं स्वीकार किया है, इसलिए मुझे यह कहना चाहिए कि मैंने क्या किया। पता चला है कि आप इस तरह के लेनदेन से बाहर निकलना कर सकते हैं:

class AddFbPageIdIndexToTabs < ActiveRecord::Migration 
    def up 
    execute "END" 
    execute "CREATE INDEX CONCURRENTLY bob_lob_law_index ON bob_lob (law)" 
    execute "BEGIN" 
    end 

    def down 
    execute "END" 
    execute "DROP INDEX CONCURRENTLY bob_lob_law_index" 
    execute "BEGIN" 
    end 
end 

बस बात आप लेन-देन के बाहर चलाना चाहते से पहले एक execute "END" चलाते हैं। यह उस लेनदेन को समाप्त कर देगा जो ActiveRecord :: माइग्रेशन माइग्रेशन माइग्रेशन के लिए स्वचालित रूप से सेट अप किया गया है। कोड के साथ किए जाने के बाद आप लेनदेन के बाहर भागना चाहते हैं, execute "BEGIN" एक नया लेनदेन खोलता है ताकि ActiveRecord :: माइग्रेशन अपनी सफाई प्रक्रिया के माध्यम से जा सके और लेनदेन को बंद कर दे जो इसे सोचता है।

(मैं कहाँ ऑनलाइन मैं इस चाल पाया भूल जाते हैं, और यह अब नहीं मिल रहा। संपादित करता इस स्रोत में आपका स्वागत है!)

1

मैं यह नहीं कह रहा हूं कि यह करने का यह "सही तरीका" है, लेकिन मेरे लिए जो काम किया वह केवल अलगाव में एक प्रवास को चलाने के लिए था।

rake db:migrate:up VERSION=20120801151807 

जहां 20120801151807 CREATE INDEX CONCURRENTLY प्रवासन का टाइमस्टैम्प है।

जाहिर है, जब आप एक माइग्रेशन चलाते हैं तो यह लेनदेन का उपयोग नहीं करता है।

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