जवाबों:
यदि आप इसे एक प्रवास में करते हैं तो आप शायद इसे इस तरह से कर सकते हैं:
# Make sure no null value exist
MyModel.where(date_column: nil).update_all(date_column: Time.now)
# Change the column to not allow null
change_column :my_models, :date_column, :datetime, null: false
change
विधि इसलिए इस मामले के लिए अनुकूल नहीं है क्योंकि (1) update_all
विधि दोनों विस्थापित और एक संभावित वापस लाएं पर निष्पादित होगा। यह सबसे बुरी बात नहीं हो सकती है, लेकिन क्योंकि (2) माइग्रेशन में यह जानने का कोई तरीका नहीं है कि संभावित रिवर्ट से कॉलम को क्या बदला गया। तो इस मामले के लिए मैं के साथ रहना होगा up
और down
।
रेल 4 में, यह एक बेहतर (DRYer) समाधान है:
change_column_null :my_models, :date_column, false
यह सुनिश्चित करने के लिए NULL
कि उस कॉलम में मूल्यों के साथ कोई रिकॉर्ड मौजूद नहीं है , आप एक चौथे पैरामीटर को पारित कर सकते हैं, जो NULL
मानों के साथ रिकॉर्ड के लिए उपयोग करने के लिए डिफ़ॉल्ट मान है:
change_column_null :my_models, :date_column, false, Time.now
change_column_null
। हालाँकि रिक स्मिथ की टिप्पणी ऊपर एक बहुत ही मान्य मामला है।
रेल 4 (अन्य रेल 4 उत्तर में समस्याएं हैं):
def change
change_column_null(:users, :admin, false, <put a default value here> )
# change_column(:users, :admin, :string, :default => "")
end
NULL के साथ एक कॉलम बदलने से NULL को समस्या नहीं होने दी जाएगी। यह ठीक उसी प्रकार का कोड है जो आपके विकास सेटअप में ठीक काम करेगा और तब क्रैश होगा जब आप इसे अपने LIVE उत्पादन में तैनात करने का प्रयास करेंगे । आपको पहले NULL मान को किसी मान्य चीज़ में बदलना चाहिए और फिर NULL को अस्वीकृत करना चाहिए। 4 वाँ मूल्य change_column_null
वास्तव में ऐसा ही करता है। अधिक विवरण के लिए प्रलेखन देखें ।
इसके अलावा, मैं आम तौर पर क्षेत्र के लिए एक डिफ़ॉल्ट मान सेट करना पसंद करता हूं इसलिए मुझे हर बार एक नई वस्तु बनाने के लिए क्षेत्र के मूल्य को निर्दिष्ट करने की आवश्यकता नहीं होगी। मैंने टिप्पणी कोड को भी शामिल किया।
add_column :users, :admin, :string
तोchange_column_null(:admin, :string, false, "new_value_for_existing_records")
एक माइग्रेशन बनाएं change_column
जिसमें एक :default =>
मान है।
change_column :my_table, :my_column, :integer, :default => 0, :null => false
देखें: change_column
डेटाबेस इंजन के आधार पर आपको उपयोग करने की आवश्यकता हो सकती है change_column_null
change_column_null
।
रेल 4:
def change
change_column_null(:users, :admin, false )
end
में रेल 4.02+ के अनुसार डॉक्स वहाँ की तरह कोई विधि नहीं है update_all
2 तर्क के साथ। इसके बजाय कोई इस कोड का उपयोग कर सकता है:
# Make sure no null value exist
MyModel.where(date_column: nil).update_all(date_column: Time.now)
# Change the column to not allow null
change_column :my_models, :date_column, :datetime, null: false
यदि आप मौजूदा रिकॉर्ड रखते हैं, तो आप add_timestamps और null का उपयोग नहीं कर सकते हैं, इसलिए यहां समाधान है:
def change
add_timestamps(:buttons, null: true)
Button.find_each { |b| b.update(created_at: Time.zone.now, updated_at: Time.zone.now) }
change_column_null(:buttons, :created_at, false)
change_column_null(:buttons, :updated_at, false)
end
MyModel.update_all({:date_column => Time.now}, {:date_column => nil})
:। आपके मूल रूप में क्वेरी ने मेरे सभी मॉडलों को क्षेत्र में शून्य मान दिया है।