माइग्रेशन रेल्स: चेक एक्ज़िस्टेंस एंड गोइंग गोइंग?


80

मैं अपने प्रवास में इस तरह की बात कर रहा था:

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

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

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


यह उल्लेख करने की आवश्यकता है, कि सशर्त माइग्रेशन रोलबैक के साथ समस्याओं की ओर जाता है इस तथ्य के कारण कि रोलबैक चरण में यह ज्ञात नहीं है कि आगे के प्रवास के दौरान क्या स्थितियां थीं
ठीक

केवल रोलबैक में गैर वैकल्पिक भाग
डैन रोसेन्स्टार्क

जवाबों:


175

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

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

एक table_exists?फ़ंक्शन भी है , जो रेल 2.1 के रूप में वापस चला जाता है।


क्या यह जाँचने के लिए सबसे अच्छा अभ्यास माना जाता है कि क्या स्तंभ / तालिका को जोड़ने / बनाने से पहले मौजूद है? (मुझे पता है कि यह हाथों में समस्या पर निर्भर करता है)
एल्डो 'जिओनी' गिएम्बेलुका

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

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


4

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

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

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

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

(यह उत्तर पहले रेल में सशर्त माइग्रेशन लिखने के लिए कैसे पोस्ट किया गया था ? )


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