মাইগ্রেশনের মাধ্যমে একটি কলামে একটি ডিফল্ট মান যুক্ত করুন


276

মাইগ্রেশনের মাধ্যমে ইতিমধ্যে বিদ্যমান একটি কলামে আমি কীভাবে একটি ডিফল্ট মান যুক্ত করব?

আমি যে সমস্ত ডকুমেন্টেশন খুঁজে পেতে পারি তা আপনাকে কীভাবে করতে হবে তা দেখায় যদি কলামটি ইতিমধ্যে বিদ্যমান না তবে এই ক্ষেত্রে তা থাকে।

উত্তর:


352

আপনার এটি কীভাবে করা উচিত তা এখানে:

change_column :users, :admin, :boolean, :default => false

তবে পোস্টগ্রিএসকিউএল এর মতো কিছু ডাটাবেসগুলি এর আগে তৈরি সারিগুলির জন্য ক্ষেত্রটি আপডেট করবে না, তাই আপনি স্থানান্তরকরণের ক্ষেত্রেও ক্ষেত্রটি ম্যানুয়ালি আপডেট করেছেন তা নিশ্চিত করুন।


14
যদি আপনার বিপরীতমুখী স্থানান্তর দরকার হয় তবে এটি একটি upব্লকের পরিবর্তে একটি changeব্লকে রাখুন। আপনি downব্লকটি খালি রাখতে পারেন । এটি টেবিলটি মূল অবস্থায় ফিরে যাবে না তবে মাইগ্রেশনটি আবার ঘোরানো যাবে led
আইএএমএনএন

1
এটি কি ডেটা অক্ষত রাখবে?
মার্কো প্রিনস

2
পোস্টগ্রিসকিউএল-এ, হ্যাঁ, অন্যান্য ডাটাবেসে কী হবে তা আমি জানি না।
মরিসিও লিনহারেস

1
আপনি "মাইগ্রেশনে ম্যানুয়ালি ক্ষেত্রটি আপডেট করবেন" তা বলার অর্থ কী? এক যে কিভাবে কাজ করে?
ডেভিড আরগিল থ্যাকার

7
আমি এটি পোস্টগ্রাইএসকিউএল এ চেষ্টা করেছি এবং এটি পূর্বে তৈরি ক্ষেত্রগুলিকে আপডেট করেছে।
আবুজার রাজাবি 12'16

190
change_column_default :employees, :foreign, false

1
@ ডেনিসলিন্স আমি আপনার সাথে একমত হয়েছি, সুতরাং এটি কেন না হতে পারে তা নির্ধারণ করার জন্য আমি কিছু গবেষণা করেছি এবং এটি প্রমাণিত হয়েছে যে কোনও নির্দিষ্ট ডাটাবেস অ্যাডাপ্টার এটি সমর্থন করে না, কারণ এটি স্তরটিতে প্রয়োগ করা হয়েছে। গৃহীত উত্তরটি বিমূর্ত মডেলটিতে প্রয়োগ না হওয়া অবধি সবচেয়ে নিরাপদ বাজি। apidock.com/rails/ActtiveRecord/ConnicationAdapters/…
নচিকেতা

5
তদ্ব্যতীত, আপনাকে একটি নির্দিষ্ট করতে হবে from:এবং to:যদি আপনি
এটিটি

5
ব্যবহার fromএবং toএই 5+ পাগল মধ্যে যোগ করা হয়েছিল সমর্পণ github.com/rails/rails/pull/20018/files
জশুয়া পিন্টার

114

রেল 4+ এর জন্য ব্যবহার করুনchange_column_default

def change
  change_column_default :table, :column, value
end

1
এটি দুর্দান্ত, বিশেষত যদি আপনার কোনও মাইগ্রেশন থাকে যা একটি কলাম যুক্ত করে এবং বিদ্যমান রেকর্ডগুলির জন্য ডিফল্ট সেট করে। উদাহরণস্বরূপ: def change `add_column: foos,: নাম, ডিফল্ট:" বিদ্যমান মানের জন্য কিছু "` _ change_column_default: foos,: নাম, ডিফল্ট: "" `end
user1491929

2
এই মাইগ্রেশনটির একটি অদ্ভুত আচরণ রয়েছে। আপনার উদাহরণে এটি অপরিবর্তনীয়। এজগাইডস.আরউবায়নরইলস.আর / অ্যাক্টিভ_রেকার্ড_ইমিগ্রেশনস html এটিকে এভাবে ব্যবহার করার পরামর্শ দেয়: change_column_default :products, :approved, from: true, to: false- তবে এটি খুব বেশি কার্যকর হয় না।
ইলিয়া ক্রিগুজোভ

যে রোলব্যাক ব্যবহার করে না?
aldrien.h

সাধারণত তাই হ্যাঁ, প্রায় কোনও "পরিবর্তন" দফার জন্য, যেহেতু পূর্ববর্তী সমস্ত রাজ্য সাধারণত স্পষ্ট হয় যেমন একটি কলামের উপস্থিতি, এটি টাইপ ইত্যাদি The বৈধ সুস্পষ্ট ডিফল্ট আগে। যেহেতু এটি সাধারণ যে ডিফল্টগুলি অনির্ধারিত হয়, আপনার সেখানে সমস্যা থাকতে পারে।
এলিন্ডোর

48

ব্যবহারের def changeঅর্থ হ'ল আপনার বিপরীতমুখী স্থানান্তর লিখতে হবে। এবং change_columnবিপরীত হয় না। আপনি উপরে যেতে পারেন তবে আপনি নীচে যেতে পারবেন না, যেহেতু change_columnঅপরিবর্তনীয়।

পরিবর্তে, যদিও এটি কয়েকটি অতিরিক্ত লাইন হতে পারে তবে আপনার ব্যবহার করা উচিত def upএবংdef down

সুতরাং আপনার যদি কোনও ডিফল্ট মান না দিয়ে কলাম থাকে তবে একটি ডিফল্ট মান যুক্ত করার জন্য আপনার এটি করা উচিত।

def up
  change_column :users, :admin, :boolean, default: false
end

def down
  change_column :users, :admin, :boolean, default: nil
end

অথবা আপনি যদি কোনও বিদ্যমান কলামের জন্য ডিফল্ট মান পরিবর্তন করতে চান।

def up
  change_column :users, :admin, :boolean, default: false
end

def down
  change_column :users, :admin, :boolean, default: true
end

37

** কক্ষগুলি 4.X + **

রেল 4 হিসাবে আপনি কোনও ডিফল্ট মান সহ কোনও টেবিলটিতে একটি কলাম যুক্ত করতে মাইগ্রেশন তৈরি করতে পারবেন না, নিম্নলিখিত পদক্ষেপগুলি ডিফল্ট মানটি সত্য বা মিথ্যা সহ একটি বিদ্যমান টেবিলটিতে একটি নতুন কলাম যুক্ত করবে।

1. নতুন কলাম যুক্ত করতে কমান্ড লাইন থেকে মাইগ্রেশন চালান

$ rails generate migration add_columnname_to_tablename columnname:boolean

উপরের কমান্ডটি আপনার টেবিলে একটি নতুন কলাম যুক্ত করবে।

2. তৈরি নতুন মাইগ্রেশন ফাইল সম্পাদনা করে নতুন কলাম মানকে সত্য / মিথ্যাতে সেট করুন।

class AddColumnnameToTablename < ActiveRecord::Migration
  def change
    add_column :table_name, :column_name, :boolean, default: false
  end
end

** 3। আপনার অ্যাপ্লিকেশন ডাটাবেস সারণিতে পরিবর্তন করতে, টার্মিনালে নিম্নলিখিত কমান্ডটি চালান **

$ rake db:migrate

এটি কীভাবে 3+ বা 2+ রেলের চেয়ে আলাদা?
রুবি রেসার

2
কেউ কি জানেন যে এটি রেল 5-এ অন্তর্ভুক্ত করা হয়েছে?
সাম্যাবেকার

9

এক্সিকিউট:

rails generate migration add_column_to_table column:boolean

এটি এই স্থানান্তর তৈরি করবে:

class AddColumnToTable < ActiveRecord::Migration
  def change
    add_column :table, :column, :boolean
  end
end

ডিফল্ট মান যুক্ত করে সেট করুন: ডিফল্ট => 1

add_column: টেবিল,: কলাম,: বুলিয়ান,: ডিফল্ট => 1

চালান:

rak db: স্থানান্তরিত করা


2
এখন 1 ডিফল্ট মান ঠিক একটি বুলিয়ান নয়;) এ ছাড়া, এই exampe যোগ পরিবর্তে বিদ্যমান কলাম, যা কি ওপি অর্জন করতে চেয়েছিলেন পরিবর্তনের, একটি নতুন কলাম
radiospiel

@radiospiel আসলে, 1 হ'ল একটি বুলিয়ানও :)
কিন্ডুফ

এটি এড়াতে আপনার বিদেশী কী টেবিলে 1 টি আইডি সহ একটি রেকর্ড তৈরি করতে হবে, এটি এড়াতে Key is not present in table error
প্রেস্টন

-50

এটিই আপনি করতে পারেন:

class Profile < ActiveRecord::Base
  before_save :set_default_val

  def set_default_val
    self.send_updates = 'val' unless self.send_updates
  end
end

সম্পাদনা: ... তবে স্পষ্টতই এটি একটি রুকির ভুল!


আপনি যদি স্কিমা বনাম হিসাবে ডিফল্ট সেট করে থাকেন তবে এটি ভালbefore_save
রিগেলস্টপিয়ার

6
কি ভয়ানক পরামর্শ
svelandiag

সম্মত, এটি সত্যিই ভয়ানক
হুচেং

3
হ্যাঁ, আপনি ডাটাবেস স্তরের পরিবর্তে মডেল স্তরে কিছু করার জন্য প্রচুর উত্তাপ পেয়েছেন। -38 একটি কিংবদন্তি স্কোর।
নুরেটিন

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