ruby on rails - আমি Rails মাইগ্রেশন একটি Ruby একটি ডাটাবেস কলামের নামকরণ করতে পারেন?
ruby-on-rails ruby-on-rails-3 (17)
API থেকে:
rename_column(table_name, column_name, new_column_name)
এটি একটি কলাম renames কিন্তু টাইপ এবং কন্টেন্ট একই থাকে।
hased_password
পরিবর্তে আমি ভুলভাবে একটি কলাম hased_password
নামকরণ করেছি।
আমি কিভাবে এই কলামের নাম পরিবর্তন করতে মাইগ্রেশন ব্যবহার করে ডাটাবেস স্কিমা আপডেট করব?
Rails উপর রুবি জন্য 4:
def change
rename_column :table_name, :column_name_old, :column_name_new
end
আইএমও, এই ক্ষেত্রে, ভাল ব্যবহার rake db:rollback
। তারপর আপনার মাইগ্রেশন সম্পাদনা করুন এবং আবার rake db:migrate
টাইপ করুন rake db:migrate
। যাইহোক, যদি আপনার কাছে কলামের ডেটা থাকে যা আপনি হারাতে চান না তবে rename_column
ব্যবহার rename_column
।
আপনার এটি করার দুটি উপায় আছে:
রোলব্যাকের ক্ষেত্রে এটি স্বয়ংক্রিয়ভাবে বিপরীত কোডটি চালায়।
def change rename_column :table_name, :old_column_name, :new_column_name end
এই প্রকারে, যখন এটি
rake db:migrate
তখন আপ পদ্ধতিটি চালায়rake db:migrate
এবং নিম্ন পদ্ধতিটি রান করে যখনrake db:rollback
:def self.up rename_column :table_name, :old_column_name, :new_column_name end def self.down rename_column :table_name,:new_column_name,:old_column_name end
একটি মাইগ্রেশন ফাইল তৈরি করতে নিচের কমান্ডটি চালান:
rails g migration ChangeHasedPasswordToHashedPassword
তারপর db/migrate
ফোল্ডারে তৈরি ফাইলটিতে, নীচের নাম rename_column
লিখুন:
class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
কলামের নামগুলি স্যুইচ করতে হলে আপনাকে একটি ডুপ্লিকেট কলামের নাম এড়ানোর জন্য একটি স্থানধারক তৈরি করতে হবে। এখানে একটি উদাহরণ:
class SwitchColumns < ActiveRecord::Migration
def change
rename_column :column_name, :x, :holder
rename_column :column_name, :y, :x
rename_column :column_name, :holder, :y
end
end
বর্তমান তথ্য আপনার জন্য গুরুত্বপূর্ণ না হলে, আপনি কেবলমাত্র আপনার আসল মাইগ্রেশনটি ব্যবহার করে নেবে:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
উদ্ধৃতি ছাড়া, আসল মাইগ্রেশনের পরিবর্তনগুলি করুন এবং পুনরায় মাইগ্রেশনটি আবার চালান:
rake db:migrate
বিকল্প বিকল্প হিসাবে, আপনি যদি মাইগ্রেশনের ধারণা থেকে বিয়ে না করেন তবে ActiveRecord এর জন্য একটি আকর্ষক মণি রয়েছে যা আপনার জন্য স্বয়ংক্রিয়ভাবে নাম পরিবর্তন করবে, Datamapper স্টাইল। আপনি যা করেন তা হল আপনার মডেলের কলামের নাম পরিবর্তন করুন (এবং আপনার মডেল.আরবিএর নীচে Model.auto_upgrade! এবং Viola টি নিশ্চিত করুন! ডাটাবেস ফ্লাই আপডেট করা হয়।
https://github.com/DAddYE/mini_record
দ্রষ্টব্য: আপনি দ্বন্দ্ব প্রতিরোধ করতে ডিবি / schema.rb nuke করতে হবে
এখনও বিটা পর্যায়ে এবং স্পষ্টতই সবার জন্য নয় তবে এখনও একটি বাধ্যতামূলক পছন্দ (আমি বর্তমানে কোনও সমস্যা ছাড়াই দুটি অ-তুচ্ছ উত্পাদন অ্যাপ্লিকেশানগুলিতে এটি ব্যবহার করছি)
যদি আপনার কোডটি অন্যের সাথে ভাগ করা না হয়, তবে সর্বোত্তম বিকল্পটি কেবল rake db:rollback
তারপর মাইগ্রেশন এবং rake db:migrate
আপনার কলামের নাম সম্পাদনা করুন rake db:migrate
। এটাই
এবং আপনি কলামের নাম পরিবর্তন করতে অন্য মাইগ্রেশন লিখতে পারেন
def change
rename_column :table_name, :old_name, :new_name
end
এটাই.
যদি কলামটি ইতিমধ্যে ডেটা সহ জনবসতিপূর্ণ হয় এবং উত্পাদনে থাকে তবে আমি ধাপে ধাপে ধাপে ধাপে সুপারিশ করব যাতে মাইগ্রেশনের জন্য অপেক্ষা করার সময় ডাউনটাইম এড়ানো যায়।
প্রথমে আমি নতুন নাম (গুলি) সহ কলাম যুক্ত করতে একটি ডিবি মাইগ্রেশন তৈরি করব এবং পুরাতন কলামের নামের থেকে মানগুলি দিয়ে তাদের ভরাট করব।
class AddCorrectColumnNames < ActiveRecord::Migration
def up
add_column :table, :correct_name_column_one, :string
add_column :table, :correct_name_column_two, :string
puts 'Updating correctly named columns'
execute "UPDATE table_name SET correct_name_column_one = old_name_column_one, correct_name_column_two = old_name_column_two"
end
end
def down
remove_column :table, :correct_name_column_one
remove_column :table, :correct_name_column_two
end
end
তারপরে আমি কেবল সেই পরিবর্তনটি করবো, এবং পরিবর্তনটিকে উত্পাদনে পরিণত করব।
git commit -m 'adding columns with correct name'
তারপর কমিটি উত্পাদন মধ্যে push করা হয়েছে একবার, আমি চালাতে চাই।
Production $ bundle exec rake db:migrate
তারপরে আমি নতুন কলামের নামের পুরানো কলামের নাম উল্লেখ করে এমন সমস্ত মতামত / কন্ট্রোলার আপডেট করব। আমার পরীক্ষা স্যুট মাধ্যমে চালান, এবং শুধুমাত্র যারা পরিবর্তন কমিট। (নিশ্চিতভাবে এটি স্থানীয়ভাবে কাজ করে এবং প্রথম সব পরীক্ষা পাস করার পরে!)
git commit -m 'using correct column name instead of old stinky bad column name'
তারপর আমি উত্পাদন যে প্রতিশ্রুতি ধাক্কা চাই।
এই মুহুর্তে আপনি স্থানান্তর নিজেই সংযুক্ত কোন ধরনের ডাউনটাইম সম্পর্কে উদ্বেজক ছাড়া মূল কলাম মুছে ফেলতে পারেন।
class RemoveBadColumnNames < ActiveRecord::Migration
def up
remove_column :table, :old_name_column_one
remove_column :table, :old_name_column_two
end
def down
add_column :table, :old_name_column_one, :string
add_column :table, :old_name_column_two, :string
end
end
তারপরে এই সর্বশেষ মাইগ্রেশনটি bundle exec rake db:migrate
এবং bundle exec rake db:migrate
চালান bundle exec rake db:migrate
পটভূমিতে bundle exec rake db:migrate
করুন।
আমি বুঝতে পারছি এটি একটি প্রক্রিয়ার কিছুটা বেশি জড়িত, তবে আমি আমার প্রোডাকশন মাইগ্রেশন নিয়ে সমস্যাগুলি তুলনায় এটি করতে চাই।
রেলগুলিতে রুবিগুলির কয়েকটি সংস্করণ মাইগ্রেশনের জন্য আপ / ডাউন পদ্ধতিতে সমর্থন করে এবং যদি আপনার মাইগ্রেশনে আপ / ডাউন পদ্ধতি থাকে তবে:
def up
rename_column :table_name, :column_old_name, :column_new_name
end
def down
rename_column :table_name, :column_new_name, :column_old_name
end
আপনার যদি আপনার মাইগ্রেশনে change
পদ্ধতি থাকে তবে:
def change
rename_column :table_name, :column_old_name, :column_new_name
end
আরো তথ্যের জন্য আপনি স্থানান্তর করতে পারেন: রেলগুলিতে রুবি - মাইগ্রেশন বা অ্যাক্টিভ রেকর্ড মাইগ্রেশন ।
শুধু একটি নতুন মাইগ্রেশন তৈরি করুন, এবং একটি ব্লক, নীচে rename_column
ব্যবহার করুন।
rename_column :your_table_name, :hased_password, :hashed_password
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Available Transformations
অধীনে
rename_column(table_name, column_name, new_column_name):
একটি কলাম নামকরণ কিন্তু টাইপ এবং কন্টেন্ট রাখে।
আপডেট - create_table এর একটি ঘনিষ্ঠ চাচাতি পরিবর্তন_table, বিদ্যমান সারণিগুলি পরিবর্তনের জন্য ব্যবহৃত হয়। এটি create_table তে একই রকম ব্যবহৃত হয় তবে ব্লকটিতে প্রাপ্ত বস্তুটি আরো কৌশলগুলি জানে। উদাহরণ স্বরূপ:
class ChangeBadColumnNames < ActiveRecord::Migration
def change
change_table :your_table_name do |t|
t.rename :old_column_name, :new_column_name
end
end
end
এই পদ্ধতিটি আরও কার্যকরী হয় যদি আমরা অন্যান্য পরিবর্তন পদ্ধতির সাথে করি যেমন: সরান / যোগ করুন সূচক / সরান সূচক / কলাম যুক্ত করুন, যেমন আমরা আরও কিছু করতে পারি:
# Rename
t.rename :old_column_name, :new_column_name
# Add column
t.string :new_column
# Remove column
t.remove :removing_column
# Index column
t.index :indexing_column
#...
রেল মাইগ্রেশন উপর একটি রুবি জেনারেট করুন :
$:> rails g migration Fixcolumnname
মাইগ্রেশন ফাইল (XXXXXfixcolumnname.rb) কোডটি সন্নিবেশ করান :
class Fixcolumnname < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
def change
rename_column :table_name, :old_column_name, :new_column_name
end
rename_column :table, :old_column, :new_column
হালনাগাদ:
আপনি সম্ভবত এই একটি পৃথক মাইগ্রেশন তৈরি করতে চান। (আপনি চান হিসাবে FixColumnName পুনঃনামকরণ)
script/generate migration FixColumnName
# creates db/migrate/xxxxxxxxxx_fix_column_name.rb
তারপর আপনার ইচ্ছা করতে মাইগ্রেশন সম্পাদনা।
# db/migrate/xxxxxxxxxx_fix_column_name.rb
class FixColumnName < ActiveRecord::Migration
def self.up
rename_column :table_name, :old_column, :new_column
end
def self.down
# rename back if you need or do something else or do nothing
end
end
Rails 3.1 এর জন্য একটি আপডেট
যদিও, up
এবং down
পদ্ধতি এখনও প্রয়োগ। রেল 3.1 একটি change
পদ্ধতি পায় যা "আপনার ডেটাবেসটি কিভাবে স্থানান্তরিত করতে হয় এবং কোনও পৃথক পদ্ধতিতে লেখার প্রয়োজন ছাড়াই মাইগ্রেশনটি ঘূর্ণায়মান হলে এটি বিপরীত করে"
rails g migration FixColumnName
class FixColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
যদি আপনি পুরো কলামের নাম পরিবর্তন করতে চান, বা এমন একটি জিনিস যা আবার টেবিলের নামের পুনরাবৃত্তি করতে হবে।
rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...
আপনি change_table
little little neater রাখার জন্য change_table
ব্যবহার করতে পারেন।
class FixColumnNames < ActiveRecord::Migration
def change
change_table :table_name do |t|
t.rename :old_column1, :new_column1
t.rename :old_column2, :new_column2
...
end
end
end
ধন্যবাদ, Luke
Turadg
, Turadg
আনয়ন করার জন্য।
তারপর শুধু db:migrate
স্বাভাবিক হিসাবে db:migrate
বা যাই হোক না কেন আপনি আপনার ব্যবসা সম্পর্কে যান।
Rails জন্য একটি আপডেট 4
একটি কলামের পুনঃনামকরণের জন্য একটি Migration
তৈরি করার সময়, উপরের 4 টি উত্তর হিসাবে উল্লিখিত রেলের 4 পরিবর্তে change
পদ্ধতি তৈরি করে। উত্পন্ন change
পদ্ধতি নীচে হিসাবে:
$ > rails g migration ChangeColumnName
যা অনুরূপ একটি মাইগ্রেশন ফাইল তৈরি করবে:
class ChangeColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end