2009-10-29 16 views
53

मैं अपने माइग्रेशन में बात इस तरह का कर रहा था:रेल प्रवास: अस्तित्व की जांच करें और जा रहे रहें?

add_column :statuses, :hold_reason, :string rescue puts "column already added" 

लेकिन यह पता चला है कि, जबकि इस SQLite के लिए काम करता है, यह PostgreSQL के लिए काम नहीं करता। ऐसा लगता है कि add_column उड़ाता है, भले ही अपवाद पकड़ा गया हो, लेनदेन मर चुका है और इसलिए माइग्रेशन कोई अतिरिक्त काम नहीं कर सकता है।

क्या कोई गैर-डीबी सेपेसिफिक यह जांचने के तरीके हैं कि कोई कॉलम या तालिका पहले से मौजूद है या नहीं? यह असफल रहा, क्या मेरे बचाव ब्लॉक को वास्तव में काम करने का कोई तरीका है?

उत्तर

132

रेल 3.0 और बाद में, आप कॉलम के अस्तित्व की जांच के लिए column_exists? का उपयोग कर सकते हैं।

unless column_exists? :statuses, :hold_reason 
    add_column :statuses, :hold_reason, :string 
end 

वहाँ भी है एक table_exists? समारोह है, जो रूप में वापस दूर चला जाता है रेल के रूप में 2.1।

+0

यह सबसे अच्छा pract माना जाता है बर्फ जोड़ने के लिए यह जांचने के लिए कि कोई कॉलम/टेबल मौजूद है या नहीं? (मुझे पता है कि यह हाथों में समस्या पर निर्भर करता है) –

+2

क्या यह रोलबैक के साथ काम करता है अगर मैं इसे परिवर्तन विधि में परिभाषित करता हूं? – dardub

+0

हाँ रोलबैक एक मुद्दा होगा ... हमें यकीन नहीं है कि हमें कॉलम को हटा देना चाहिए या नहीं .. क्योंकि हम पिछले राज्य को रिकॉर्ड नहीं कर रहे हैं। – songyy

4

रेल 2.X के लिए, आप स्तंभों के अस्तित्व निम्नलिखित के साथ देख सकते हैं: यह शून्य देता है, तो

columns("[table-name]").index {|col| col.name == "[column-name]"} 

, ऐसी कोई स्तंभ मौजूद है। अगर यह फिक्सनम देता है, तो कॉलम मौजूद है। स्वाभाविक रूप से, आप {...} के बीच अधिक चयनात्मक मापदंडों अगर आप सिर्फ अपने नाम से ज्यादा से एक कॉलम की पहचान करना चाहते डाल सकते हैं, उदाहरण के लिए:

{ |col| col.name == "foo" and col.sql_type == "tinyint(1)" and col.primary == nil } 

(इस जवाब पहले How to write conditional migrations in rails? पर पोस्ट)

0

add_column: स्थितियां ,: hold_reason,: स्ट्रिंग जब तक Status.column_names.include ("hold_reason")

5

या भी कम

add_column :statuses, :hold_reason, :string unless column_exists? :statuses, :hold_reason 
+0

यह अन्य उत्तर पर एक टिप्पणी होगी, जवाब नहीं। धन्यवाद। –

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