কীভাবে একটি রেল মাইগ্রেশনে আণনীয় নয় এমন একটি কলাম কলাম পরিবর্তন করবেন?


188

আমি পূর্ববর্তী মাইগ্রেশনে একটি তারিখ কলাম তৈরি করেছি এবং এটিকে naclable হতে সেট করেছি। এখন আমি এটি পরিবর্তনযোগ্য না হয়ে পরিবর্তন করতে চাই। আমি কীভাবে এই অনুমান করে এই কাজটি করতে যাব যে সেই ডাটাবেসে নাল সারি রয়েছে? আমি এই কলামগুলি টাইম করার জন্য ঠিক করেছি। এখন সেগুলি শূন্য থাকলে তারা।

উত্তর:


204

আপনি যদি কোনও মাইগ্রেশনে এটি করেন তবে সম্ভবত আপনি এটি এটি করতে পারেন:

# 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

1
কেবল একটি নোট, কারণ এটি আমার ডেভ ডাটাবেসটিকে আবদ্ধ করেছে। বরং এই মত স্পষ্ট হ্যাশ সিনট্যাক্স ব্যবহার: MyModel.update_all({:date_column => Time.now}, {:date_column => nil})। আপনার মূল ফর্মের ক্যোয়ারীটি সবেমাত্র আমার সমস্ত মডেলের ক্ষেত্রেই শূন্যের মূল্যহীন made
dimitarvp

আপডেটের জন্য ধন্যবাদ. আমি জানি আমি যখন এই উত্তরটি লিখেছিলাম তখন এটি ছিল না তবে আমি রুবি বা আরআর এর কোন সংস্করণ ব্যবহার করছিলাম তা আমি মনে করতে পারি না।
ড্যানম্যান্মে

1
আপনার কি এই স্থানান্তরে 'আপ' / 'ডাউন' পদ্ধতিটি ব্যবহার আছে, বা আপনি কি স্থানান্তরিতকরণের সহজ পদ্ধতিটি করতে পারবেন?
EE33

2
changeপদ্ধতি তাই এই ক্ষেত্রে জন্য উপযুক্ত নয় কারণ (1) update_allপদ্ধতি উভয় স্থানান্তরণ করুন এবং একটি সম্ভাব্য প্রত্যাবর্তন মৃত্যুদন্ড কার্যকর হবে। এটি সবচেয়ে খারাপ জিনিস নাও হতে পারে তবে কারণ (২) কলামটি সম্ভাব্য প্রত্যাবর্তনের ফলে কীভাবে কলামটি পরিবর্তন হয়েছিল তা স্থানান্তরের কোনও উপায় নেই। সুতরাং এই ক্ষেত্রে আমি সাথে থাকব upএবং down
ড্যানম্যান্মে

2
আগ্রহী প্রত্যেকের জন্য, আমার উত্তরটি দেখায় যে কীভাবে এটি একক পদক্ষেপে করা যায়।
রিক স্মিথ

167

4 রেলগুলিতে এটি একটি ভাল (DRYer) সমাধান:

change_column_null :my_models, :date_column, false

এই NULLকলামে মানগুলির সাথে কোনও রেকর্ড উপস্থিত নেই তা নিশ্চিত করতে, আপনি একটি চতুর্থ প্যারামিটারটি পাস করতে পারেন, যা মান সহ রেকর্ডগুলির জন্য ডিফল্ট NULLমান:

change_column_null :my_models, :date_column, false, Time.now

4
যখন টেবিলটির ইতিমধ্যে নাল মান থাকে তখন এটি সমস্যার সৃষ্টি করে। আমার উত্তর দেখুন
রিক স্মিথ

5
এছাড়াও পাওয়া যায় 3.2। ডিফল্ট সেট করার জন্য একটি চতুর্থ প্যারামিটার রয়েছে যেখানে মানটি শূন্য।
toxaq

1
প্লাস 1 এর জন্য change_column_null। তবে উপরে রিক স্মিথের মন্তব্যটি একটি খুব বৈধ কেস দেখায়।
0112

নাল মানগুলি আপডেট করার জন্য ক্যোয়ারী যুক্ত করতে আপডেট করা হয়েছে। চতুর্থ প্যারামিটার (ডিফল্ট মান) কেবল তখনই কার্যকর যখন আপনি ভবিষ্যতে রেকর্ডগুলির জন্যও ডিফল্ট থাকতে চান।
mrbrdo

3
প্রকৃতপক্ষে, রেলস 4.2 ডক্স অনুসারে, চতুর্থ পরম ভবিষ্যতের রেকর্ডগুলির জন্য একটি ডিফল্ট মান নির্ধারণ করে না: "পদ্ধতিটি একটি নতুন বিকল্পের সাথে বিদ্যমান + এনএলএল + গুলিকে অন্য কোনও মানের সাথে প্রতিস্থাপনের জন্য optionচ্ছিক চতুর্থ যুক্তি গ্রহণ করে Please অনুগ্রহ করে নোট করুন চতুর্থ যুক্তি সেট করে না একটি কলামের ডিফল্ট। "
মাইক ফিশার

70

রেলস 4 (অন্যান্য রেলের 4 টির উত্তর রয়েছে):

def change
  change_column_null(:users, :admin, false, <put a default value here> )
  # change_column(:users, :admin, :string, :default => "")
end

এতে NULL মানগুলির সাথে কলাম পরিবর্তন করা NULL কে মঞ্জুরি না দেয়ায় সমস্যা দেখা দেয়। এটি হ'ল ধরণের কোড যা আপনার ডেভলপমেন্ট সেটআপে সূক্ষ্মভাবে কাজ করবে এবং তারপরে আপনার লাইভ প্রযোজনায় এটি মোতায়েন করার চেষ্টা করার পরে ক্রাশ হবে । আপনার প্রথমে NULL মানগুলি বৈধ কিছুতে পরিবর্তন করা উচিত এবং তারপরে NULL অস্বীকার করা উচিত। 4 র্থ মান change_column_nullঠিক তা করে। আরও বিশদ জন্য ডকুমেন্টেশন দেখুন ।

এছাড়াও, আমি সাধারণত ক্ষেত্রের জন্য একটি ডিফল্ট মান নির্ধারণ করতে পছন্দ করি তাই প্রতিবার নতুন কোনও বস্তু তৈরি করার সময় আমাকে ক্ষেত্রের মান নির্দিষ্ট করার প্রয়োজন হবে না। আমি পাশাপাশি মন্তব্য করতে কোড অন্তর্ভুক্ত।


3
রেলস 4 এর জন্য, এটি মন্তব্য-আউট ডিফল্ট সেটিং সহ সর্বাধিক নির্ভুল এবং সম্পূর্ণ উত্তর বলে মনে হচ্ছে।
মাইক ফিশার

4
আপনি যদি কোনও টেবিলে একটি নতুন কলাম যুক্ত করছেন এবং add_column :users, :admin, :stringchange_column_null(:admin, :string, false, "new_value_for_existing_records")
শূন্যের

34

একটি মাইগ্রেশন তৈরি করুন change_columnযার একটি :default =>মান সহ একটি বিবৃতি রয়েছে ।

change_column :my_table, :my_column, :integer, :default => 0, :null => false

দেখুন: পরিবর্তন_কলাম

ডাটাবেস ইঞ্জিনের উপর নির্ভর করে আপনার ব্যবহারের প্রয়োজন হতে পারে change_column_null


1
এটি আমার পক্ষে কাজ করেছে। স্থানীয়ভাবে MySQL ব্যবহার করা। হেরোকুতে (পোস্টগ্রিস) যখন ধাক্কা দিয়ে অ্যাপ চালিত হয় তখন এটি কলামে ফেটে যায় যে আমি যখন নਾਲ লিখছিলাম তখন তা বাতিল ছিল না - ঠিক তাই। কেবলমাত্র "চেঞ্জ_কলোম_নুল" কাজ করবে মাইএসকিএলে "চেঞ্জ_কলোম ...: নাল => মিথ্যা" ব্যবহার করতে পারে না। ধন্যবাদ।
rtfminc

1
সুতরাং পরিবর্তন_ কলাম_নুল
js111

1
পোস্টগুলি মাইএসকিউএল থেকে আরও কড়া - আমি আশা করি যে এটির প্রয়োজন হবে change_column_null
jessecurry

3
@rtfminc আমি আপনাকে একইভাবে ডেটাবেস ইঞ্জিনকে বিকাশে এবং উত্পাদনে ব্যবহার করার জন্য দৃ strongly়ভাবে পরামর্শ দিচ্ছি, কারণ এটি যখন সমস্যাগুলির দিকে আসে তখন এটি অনেক সমস্যা এড়ায়।
ইয়াগুয়ার


3

ইন পাগল 4.02+ অনুযায়ী ডক্স মত কোন পদ্ধতি update_all2 আর্গুমেন্ট সহ। পরিবর্তে যে কেউ এই কোডটি ব্যবহার করতে পারেন:

# 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

2

আপনি অ্যাড_টাইমস্ট্যাম্প এবং নাল ব্যবহার করতে পারবেন না: আপনার যদি বিদ্যমান রেকর্ড থাকে তবে মিথ্যা, সুতরাং সমাধানটি এখানে দেওয়া হয়েছে:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.