রেল মাইগ্রেশন: একটি কলামের জন্য ডিফল্ট সেটিংস পূর্বাবস্থায় ফেরান


190

আমার সমস্যা আছে, আমার কাছে কারাগুলিতে একটি মাইগ্রেশন আছে যা এই কলের জন্য একটি কলামের জন্য একটি ডিফল্ট সেটিংস সেট আপ করে:

def self.up
  add_column :column_name, :bought_at, :datetime, :default => Time.now
end

মনে করুন, আমি পরবর্তী মাইগ্রেশনে সেই ডিফল্ট সেটিংসগুলি ফেলে দিতে চাই, রেলের স্থানান্তরগুলি ব্যবহার করে আমি কীভাবে এটি করব?

আমার বর্তমান কাজটি হ'ল রেল মাইগ্রেশনে একটি কাস্টম এসকিএল কমান্ড কার্যকর করা, এটির মতো:

def self.up
  execute 'alter table column_name alter bought_at drop default'
end

তবে আমি এই পদ্ধতির পছন্দ করি না, কারণ অন্তর্নিহিত ডাটাবেস কীভাবে এই আদেশটি ব্যাখ্যা করে তার উপরে আমি এখন নির্ভরশীল। ডাটাবেস পরিবর্তনের ক্ষেত্রে এই কোয়েরিটি সম্ভবত আর কাজ করবে না এবং মাইগ্রেশনটি ভেঙে যাবে। সুতরাং, রেলের কোনও কলামের জন্য ডিফল্ট সেটিংসের পূর্বাবস্থা প্রকাশ করার কোনও উপায় আছে কি?

উত্তর:


387

রেল 5+

def change
  change_column_default( :table_name, :column_name, from: nil, to: false )
end

রেল 3 এবং রেল 4

def up
  change_column_default( :table_name, :column_name, nil )
end

def down
  change_column_default( :table_name, :column_name, false )
end

7
পোস্টগ্রাগে CHARACTER VARYINGএটি কলামগুলির জন্য ডিফল্টটি আসলে ফেলে দেবে না , কেবল এটি সেট করে NULL::character varying
আটটিলা ও।

8
আরও সাম্প্রতিক সংস্করণগুলিতে আপনি এটিকে বিপরীতমুখী করতে পারেন। উদাহরণস্বরূপ: change_column_default(:table_name, :column_name, from: nil, to: false)
চিহ্নিত করুন

1
@AttilaO। আমি সাফল্য দৌড়াদৌড়ি করেছি ALTER TABLE table_name ALTER COLUMN type DROP DEFAULT, NULLআমার মনে হয় এটি সেট করার দরকার নেই ।
এলি রোজ - মনিকা পুনরায় ইনস্টল করুন

এফওয়াইআই, এটি বিপরীত সংস্করণটির মতো দেখায় যা @ মার্ক উল্লেখ করেছে +++ রেলের মধ্যে, সুতরাং এর নিচে যে কোনও কিছুই আপনি এটি ব্যবহার করতে পারবেন না।
জোশুয়া পিন্টার

23

সাউন্ড তোমার মত সাথে সঠিক জিনিস করছেন আপনার 'চালানো', যেমন ডক্স বাতলান:

change_column_default(table_name, column_name, default)

কলামের জন্য একটি নতুন ডিফল্ট মান সেট করে। আপনি যদি NULL এ ডিফল্ট মান সেট করতে চান তবে আপনার ভাগ্যের বাইরে। আপনার প্রয়োজন ডাটাবেসস্টেটমেন্টস # যথাযথ এসকিউএল বিবৃতি নিজেই চালিত করতে। উদাহরণ

change_column_default(:suppliers, :qualification, 'new')
change_column_default(:accounts, :authorized, 1)

ধন্যবাদ! দস্তাবেজে এই ইঙ্গিতটি আমি নিজে খুঁজে পাইনি! ভবিষ্যতের রেলের রেল সংস্করণগুলিতে হিফফুল তারা মাইগ্রেশনে ডিফল্ট মানগুলি ফেলে দেওয়ার ক্ষেত্রে তৈরি করে।
উলফোভিচ

1
এটি আর ৩.১.০, সিএফআর হিসাবে সত্য নয়। apidock.com/rails/v3.1.0/ActtiveRecord/ConnicationAdapters/…
অসম্পূর্ণ

14

NULLকলামগুলি তৈরি করতে আমি নিম্নলিখিত স্নিপেট ব্যবহার করি NOT NULLতবে DEFAULTস্কিমা স্তরে এড়িয়ে যান:

def self.up
  change_column :table, :column, :string, :null => false, :default => ""
  change_column_default(:table, :column, nil)
end

আমি এই উত্তরে যুক্ত মূল্য দেখতে পাচ্ছি না যেহেতু গৃহীত একজন একই রকম বলে।
মোসেলম্যান

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