रूबी ऑन रेल्स: मैं एक माइग्रेशन का उपयोग करते हुए मौजूदा कॉलम में एक अशक्त बाधा कैसे नहीं जोड़ूं?


130

मेरे रेल्स (3.2) ऐप में, मेरे डेटाबेस में टेबलों का एक गुच्छा है, लेकिन मैं कुछ अड़चन नहीं जोड़ना भूल गया। मैं चारों ओर घूम चुका हूं, लेकिन मैं यह नहीं लिख सकता कि एक माइग्रेशन कैसे लिखा जाए जो किसी मौजूदा कॉलम में अशक्त न हो।

TIA।

जवाबों:


93

रेल 4+ के लिए, nates का उत्तर ( change_column_null का उपयोग करके ) बेहतर है।

प्री-रेल 4, change_column को आज़माएं


25
इस दृष्टिकोण के साथ सावधान रहें - यदि आपके पास उस कॉलम के बारे में अन्य विशेषताएं थीं (उदाहरण के लिए एक :limitबाधा), तो आपको उपयोग करते समय उन विशेषताओं को दोहराना change_columnहोगा, या वे खो जाएंगे। इस कारण से, मैं का उपयोग करना पसंदchange_column_null
नाथन वालेस

ध्यान दें कि यह एक उत्पन्न करता है IrreversibleMigrationजो वह नहीं हो सकता जो आप चाहते हैं।
निक निलोव

@NicNilov आप उत्तर या नाथन वालेस की टिप्पणी के बारे में बात कर रहे हैं?
मार्क

@ मर्क मैं जवाब के बारे में बात कर रहा था, विशेष पर्याप्त नहीं होने के लिए खेद है।
निक निलोव

@NicNilov नहीं dw मुझे लगता है कि हालांकि मैं सिर्फ दोहरी जाँच करना चाहता था :)
मार्क

274

आप change_column_null का भी उपयोग कर सकते हैं :

change_column_null :table_name, :column_name, false

8
सबसे साफ जवाब!
जोश क्लिक

1
मुझे इसे स्तंभों के एक समूह के लिए बदलना पड़ा और इसके लिए प्रत्येक स्तंभ के लिए स्तंभ प्रकार निर्दिष्ट करने की आवश्यकता नहीं है, बहुत बेहतर!
डोरियन

1
यह बेहतर उत्तर है। अपने डेटाबेस में, मैं पहले से मौजूद अशक्त मूल्यों के साथ एक स्तंभ पर एक अशक्त बाधा जोड़ रहा था। change_column उन मानों को अपडेट नहीं करेगा। प्रलेखन के अनुसार, change_column_null का एक वैकल्पिक चौथा मूल्य है जो अद्यतन के लिए नया मान है।
मेरोवेक्स

इसके लिए धन्यवाद। सबसे बढ़िया उत्तर।
रयान रेबो

1
दिलचस्प साइड इफेक्ट .... माइग्रेशन को वापस रोल करने से फ़ील्ड विपरीत (झूठी -> सत्य) पर सेट हो जाएगी। इसलिए यदि आप एक अशक्त बाधा को जोड़ने के लिए कई फ़ील्ड्स के लिए माइग्रेशन बनाते हैं, और कुछ फ़ील्ड ALREADY में एक अशक्त बाधा होती है, तो माइग्रेशन को रोलबैक करें, यह किसी भी फ़ील्ड से पहले से मौजूद नॉले बाधा को हटा देगा।
jpw

10

1) FIRST: डिफ़ॉल्ट मान के साथ कॉलम जोड़ें

2) यह: डिफ़ॉल्ट मान निकालें

add_column :orders, :items, :integer, null: false, default: 0
change_column :orders, :items, :integer, default: nil

2
यह सही समाधान है जब आपको नए कॉलम को जोड़ने की आवश्यकता होती है जो शून्य नहीं है, आपको पहले यह परिभाषित करने की आवश्यकता है कि इसका डिफ़ॉल्ट मान है क्योंकि SQLLite शिकायत करेगा (डिफ़ॉल्ट मान NULL के साथ NOT NULL कॉलम नहीं जोड़ सकता है), और फिर इसे हटा दें!
मिलान

2

यदि आप इसे एक नई क्रिएट माइग्रेशन स्क्रिप्ट / स्कीमा पर उपयोग कर रहे हैं तो हम इसे कैसे परिभाषित कर सकते हैं

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
    t.string :name, null: false     # Notice here, NOT NULL definition
    t.string :email, null: false
    t.string :password, null: false
    t.integer :created_by
    t.integer :updated_by 

    t.datetime :created_at
    t.datetime :updated_at, default: -> { 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' }
   end
  end
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.