যোগ করা হচ্ছে: ডিফল্ট => বিদ্যমান রেল কলামে বুলিয়ান থেকে সত্য


160

বিদ্যমান কলামে একটি ডিফল্ট বুলিয়ান মান যোগ করার বিষয়ে আমি এখানে কয়েকটি প্রশ্ন (যথা এটি একটি ) দেখেছি । সুতরাং আমি change_columnপরামর্শটি চেষ্টা করেছিলাম তবে আমার এটি ঠিক করা উচিত হবে না।

আমি চেষ্টা করেছিলাম:

$ change_column :profiles, :show_attribute, :boolean, :default => true

যা ফিরে আসে -bash: change_column: command not found

আমি তখন দৌড়েছি:

$ rails g change_column :profiles, :show_attribute, :boolean, :default => true

...এবং

$ rails change_column :profiles, :show_attribute, :boolean, :default => true

তারপরে দৌড়ে গেল rake db:migrate, তবে মানটি :show_attributeরয়ে গেল nil। আমি উপরে উল্লিখিত প্রশ্নে এটি পোস্টগ্রিজ এসকিউএল এ বলেছে আপনাকে এটি ম্যানুয়ালি আপডেট করতে হবে। যেহেতু আমি পোস্টগ্রিজ এসকিউএল ব্যবহার করছি আমি আমার create_profilesমাইগ্রেশনে নিম্নলিখিতগুলি যুক্ত করেছি :

t.boolean :show_attribute, :default => true

কেউ আমাকে বলতে পারে যে আমি এখানে কী ভুল করছি?

উত্তর:


314

change_columnএটি একটি পদ্ধতি ActiveRecord::Migration, সুতরাং আপনি কনসোলে এটিকে কল করতে পারবেন না।

আপনি যদি এই কলামটির জন্য একটি ডিফল্ট মান যুক্ত করতে চান তবে একটি নতুন স্থানান্তর তৈরি করুন:

rails g migration add_default_value_to_show_attribute

তারপরে স্থানান্তরিত স্থানে:

# That's the more generic way to change a column
def up
  change_column :profiles, :show_attribute, :boolean, default: true
end

def down
  change_column :profiles, :show_attribute, :boolean, default: nil
end

বা আরও নির্দিষ্ট বিকল্প:

def up
    change_column_default :profiles, :show_attribute, true
end

def down
    change_column_default :profiles, :show_attribute, nil
end

তারপরে দৌড়াও rake db:migrate

এটি ইতিমধ্যে তৈরি করা রেকর্ডগুলিতে কিছুই পরিবর্তন করবে না। এটি করতে আপনাকে একটি তৈরি করতে হবে rake taskবা কেবল প্রবেশ করতে হবে rails consoleএবং সমস্ত রেকর্ড আপডেট করতে হবে (যা আমি প্রযোজনায় সুপারিশ করব না)।

আপনি যখন মাইগ্রেশনে যুক্ত t.boolean :show_attribute, :default => trueহয়েছেন create_profiles, আশা করা যায় এটি কিছুই করেনি। ইতিমধ্যে চালানো হয়নি এমন মাইগ্রেশনগুলিই কার্যকর করা হয়। আপনি যদি একটি নতুন ডেটাবেস দিয়ে শুরু করেন, তবে এটি ডিফল্টটিকে সত্য হিসাবে সেট করে।


2
সেই পরিবর্তন_ কলাম কলটি upমাইগ্রেশনের পদ্ধতিতে হওয়া উচিত , এটি একটি নতুন শ্রেণি যা ডিবি / মাইগ্রেট / এ উত্পন্ন হবে। ( downপদ্ধতিটি কী হবে upতা পূর্বাবস্থায় লিখতে হবে that) তারপরে পরিবর্তনটি করুন rake db:migrate
rkb

আহ, এটি আরও বোধগম্য করে তোলে আরকেবি। ধন্যবাদ!
টিভিলেন্ট 2

আমি লিখে না হওয়া পর্যন্ত এটি আমার পক্ষে কাজ করছে না def self.upএবংdef self.down
কামিল জাজোট

আপনি তখন রেলের সম্ভবত পুরানো সংস্করণ ব্যবহার করছেন। আমি মনে করি এই বাক্য গঠনটি ৩.১ থেকে রয়েছে।
রবিন

এবং 5 রেলগুলিতে, আপনি _ট্রিবিউটটি ছেড়ে যান যাতে এটি কেবল বলা showবা কলামের নাম যাই হোক।
গোলকধাঁধা

95

গৃহীত উত্তরের ভিন্নতা হিসাবে change_column_defaultআপনি নিজের স্থানান্তরগুলিতেও এই পদ্ধতিটি ব্যবহার করতে পারেন :

def up
  change_column_default :profiles, :show_attribute, true
end

def down
  change_column_default :profiles, :show_attribute, nil
end

রেলগুলি API- ডক্স


1
এটি নিশ্চিত করে যে আপনি দুর্ঘটনাক্রমে অন্য কোনও কলামের বৈশিষ্ট্য পরিবর্তন করবেন না
ব্রায়ান লো

1
এবং 5 রেলগুলিতে আপনি _ট্রিবিউটটি ছেড়ে যান যাতে এটি কেবল বলা showবা কলামের নাম যাই হোক।
গোলকধাঁধা

1
@labyrinth আপনার অর্থ কি? show_attribute হয় কলামের নাম, আমি মনে করি না পাগল 5, ঠিক সাথে কিছু আছে?
রবিন

34

আমি কখন নিশ্চিত হয়েছি এটি নিশ্চিত নই, তবে মাইগ্রেশনে কলাম থেকে একটি ডিফল্ট যোগ বা সরাতে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

change_column_null :products, :name, false

পাখি 5:

change_column_default :products, :approved, from: true, to: false

http://edgeguides.rubyonrails.org/active_record_migrations.html#changing-columns

4.2 রেলগুলি:

change_column_default :products, :approved, false

http://guides.rubyonrails.org/v4.2/active_record_migrations.html#changing-columns

কলাম স্পেসিফিকেশনগুলির জন্য আপনার স্থানান্তর বা স্কিমাটি অনুসন্ধান করা এড়ানো একটি পরিষ্কার উপায়।


সাবধান, এটি রেল 5 নথি থেকে। এর 4.2 সংস্করণের রেলগুলি হ্যাশ গ্রহণ করে না কিন্তু তৃতীয় প্যারামিটার হিসাবে ঠিক নতুন ডিফল্ট। গাইড.আরবিওনরইলস.আর
ভি

রেল 5 সম্পর্কে, উভয়টি করাই সবচেয়ে সঠিক উপায় বলে মনে হচ্ছে, উদাহরণস্বরূপ null: falseএবং default: :somethingমূলত
ডোরিয়ান

1

এছাড়াও, দস্তাবেজ অনুসারে:

কমান্ড লাইনের মাধ্যমে ডিফল্ট নির্দিষ্ট করা যায় না

https://guides.rubyonrails.org/active_record_migrations.html

সুতরাং কোনও প্রস্তুত রেল জেনারেটর নেই। উপরের উত্তরগুলি দ্বারা নির্দিষ্ট হিসাবে, আপনাকে change_column_defaultপদ্ধতিতে নিজের স্থানান্তর ফাইলটি ম্যানুয়ালি পূরণ করতে হবে ।

আপনি নিজের জেনারেটর তৈরি করতে পারেন: https://guides.rubyonrails.org/generators.html


1

আপনি যদি সবেমাত্র স্থানান্তর করেন তবে আপনি রোলব্যাক করতে পারেন এবং তারপরে আবার নিজের স্থানান্তর করতে পারেন।

রোলব্যাক করতে আপনি যতগুলি পদক্ষেপ চান তা করতে পারেন:

rake db:rollback STEP=1

অথবা, যদি আপনি 5 টি বা নতুন রেলগুলি ব্যবহার করেন:

rails db:rollback STEP=1

তারপরে, আপনি কেবল আবার স্থানান্তর করতে পারেন:

def change
  add_column :profiles, :show_attribute, :boolean, default: true
end

আপনি rake db:migrateএবং হিরকু ব্যবহার করছেন তা ভুলে যাবেন নাheroku run rake db:migrate


0
change_column :things, :price_1, :integer, default: 123, null: false

null: falseইতিমধ্যে নেই এমন একটি বিদ্যমান কলামে একটি ডিফল্ট যুক্ত করার সেরা উপায় বলে মনে হচ্ছে ।

অন্যথায়:

change_column :things, :price_1, :integer, default: 123

আমি এটি নিয়ে কিছু গবেষণা করেছি:

https://gist.github.com/Dorian/417b9a0e1a4e09a558c39345d50c8c3b


0

আপনি যদি সামান্য, সাম্প্রতিক পরিবর্তনের জন্য অন্য কোনও মাইগ্রেশন-ফাইল তৈরি করতে না চান - রেলস কনসোল থেকে:

ActiveRecord::Migration.change_column :profiles, :show_attribute, :boolean, :default => true

তারপরে প্রস্থান করুন এবং রেল কনসোলে পুনরায় প্রবেশ করুন, সুতরাং ডিবি-পরিবর্তনগুলি কার্যকর হবে। তারপরে, আপনি যদি এটি করেন ...

Profile.new()

আপনার "show_attribute" ডিফল্ট-মানটি সত্য হিসাবে দেখা উচিত।

বিদ্যমান রেকর্ডগুলির জন্য, আপনি যদি বিদ্যমান "মিথ্যা" সেটিংস সংরক্ষণ করতে চান এবং কেবলমাত্র আপনার নতুন ডিফল্টে "শূন্য" মানগুলি আপডেট করতে চান:

Profile.all.each{|profile| profile.update_attributes(:show_attribute => (profile.show_attribute == nil ? true : false))  }

এই সারণীটি তৈরি করে এমন মাইগ্রেশন আপডেট করুন, সুতরাং ভবিষ্যতে ডিবি-র যেকোন বিল্ড এটি শুরু থেকেই সঠিকভাবে পাবেন। এছাড়াও ডিবি-র যে কোনও মোতায়েন-দৃষ্টান্তে একই প্রক্রিয়া চালান।

যদি "নতুন ডিবি মাইগ্রেশন" পদ্ধতিটি ব্যবহার করে থাকেন তবে আপনি সেই স্থানান্তরটিতে বিদ্যমান শূন্য-মানগুলির আপডেট করতে পারেন।

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