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


408

নামকরণে আমি ভয়ানক এবং বুঝতে পারি যে আমার মডেলগুলির জন্য আমার রেলস অ্যাপ্লিকেশনে নামগুলির আরও ভাল সেট রয়েছে।
কোনও মডেল এবং এর সাথে সম্পর্কিত টেবিলটির নতুন নামকরণের জন্য মাইগ্রেশন ব্যবহার করার কোনও উপায় আছে কি?


11
আমি অনুসন্ধান ইঞ্জিনের মিলগুলি উন্নত করতে এই প্রশ্নের সাথে "অ্যাক্টিভেকর্ড" যুক্ত করার পরামর্শ দিয়েছি। আমি "অ্যাক্টিভেকর্ডের নাম টেবিল" ব্যবহার করে এটি সন্ধান করছি।
ল্যান্ডন কুহন

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

4
@ অ্যান্ড্রুহনিগান: কেউ যদি আপনার রেপো ক্লোন করে খালি চালিয়ে যায় তবে আপনার পয়েন্টটি মোট নয় rake db:schema:load?
istrasci

3
@istrasci: একেবারে। প্রকৃতপক্ষে, rake db:migrateস্ক্র্যাচ থেকে একটি ডেটাবেস সেট আপ করতে দৌড়ে সক্রিয়ভাবে নিরুৎসাহিত করা হয়েছে, ঠিক এ কারণেই অ্যান্ড্রু নির্দেশিত উদ্বেগগুলির কারণে।
জিউসেপ

উত্তর:


584

এখানে একটি উদাহরণ:

class RenameOldTableToNewTable < ActiveRecord::Migration
  def self.up
    rename_table :old_table_name, :new_table_name
  end

  def self.down
    rename_table :new_table_name, :old_table_name
  end
end

আমাকে নিজে গিয়ে মডেল ডিক্লেয়ারেশন ফাইলটির নাম পরিবর্তন করতে হয়েছিল।

সম্পাদনা:

ActiveRecord::Migration::CommandRecorderR.১ ও ৪ এর কালে, কীভাবে পুনর্নামকরণ_সারণযোগ্য স্থানান্তরগুলি বিপরীত করতে হয় তা জানেন, তাই আপনি এটি করতে পারেন:

class RenameOldTableToNewTable < ActiveRecord::Migration
  def change
    rename_table :old_table_name, :new_table_name
  end 
end

(আপনাকে এখনও নিজের ফাইলগুলির ম্যানুয়ালি নাম পরিবর্তন করতে হবে))


6
@ মথি: হ্যাঁ, আপনাকে সেই ম্যানুয়ালি পরিবর্তন করতে হবে, বা একটি আইডিই ব্যবহার করতে হবে যা রুবি রিফ্যাক্টরিং করতে পারে এবং এটি আপনার সংস্করণ নিয়ন্ত্রণ সিস্টেমে প্রতিশ্রুতিবদ্ধ করতে পারে।
pupeno

13
গিট গ্রেপ আপনার বন্ধু আমি এখনই একটি অভ্যাসের ক্রিয়াকলাপের নামকরণ করছি: git grep -i activitএটি অত্যন্ত প্রকাশ্য।
ফেলিক্স রাবে

1
আপনার নিয়ামকের সামগ্রীটিও পরিবর্তন করতে হবে, তাই না?
আলেমুর

5
এবং আপনার রুটগুলি ভুলে যাবেন না। Rb!
ড্যান হারম্যান

26
এছাড়াও, কেবল শীর্ষ হিসাবে আপনি নিজের টেবিলের নামটির বহুবচন সংস্করণটি পুনর্নবীকরণ_ টেবিল কলটিতে ব্যবহার করতে চান।
হান

66

4 রেলগুলিতে আমাকে যা করতে হয়েছিল তা হ'ল ডিফ পরিবর্তন

def change
  rename_table :old_table_name, :new_table_name
end

এবং আমার সমস্ত সূচী আমার জন্য যত্ন নেওয়া হয়েছিল। পুরানোগুলি মুছে ফেলা এবং নতুনগুলি যুক্ত করে নিজেই সূচকগুলি আপডেট করার দরকার নেই।

এবং এটি সূচকগুলির ক্ষেত্রেও নীচে বা নীচে যাওয়ার জন্য পরিবর্তনটি ব্যবহার করে কাজ করে।


47

অন্যান্য উত্তর এবং মন্তব্যগুলি আপনার কোডের মাধ্যমে সারণীটির পুনরায় নামকরণ, ফাইলের পুনরায় নামকরণ এবং গ্রেপিং coveredেকে রেখেছে।

আমি আরও কয়েকটি সতর্কতা যুক্ত করতে চাই:

আসুন আজ আমি একটি বাস্তব-জগতের উদাহরণটি ব্যবহার করি: 'বণিক' থেকে 'ব্যবসায়' তে একটি মডেলটির নামকরণ।

  • একই স্থানান্তরে নির্ভর টেবিল এবং মডেলগুলির নাম পরিবর্তন করতে ভুলবেন না। আমি আমার মার্চেন্ট এবং মার্চেন্টস্ট্যাট মডেলগুলি একই সাথে ব্যবসা এবং বিজনেসস্ট্যাটে পরিবর্তন করেছি। অন্যথায়, অনুসন্ধান-এবং-প্রতিস্থাপন সম্পাদন করার সময় আমাকে খুব বেশি বাছাই এবং বেছে নিতে হত।
  • বিদেশী কীগুলির মাধ্যমে আপনার মডেলের উপর নির্ভরশীল অন্য কোনও মডেলগুলির জন্য, অন্যান্য সারণীর বিদেশী-কী কলামের নামগুলি আপনার মূল মডেলের নাম থেকে নেওয়া হবে। সুতরাং আপনি এই নির্ভরশীল মডেলগুলিতে কিছু পুনর্নবীকরণ_ক্যালম কলগুলি করতে চাইবেন। উদাহরণস্বরূপ, আমাকে বিভিন্ন মার্চ সারণিতে (has_and_belongs_to_many সম্পর্কের জন্য) এবং অন্যান্য নির্ভরশীল টেবিলগুলিতে (স্বাভাবিক has_one এবং has_many সম্পর্কের জন্য) 'মার্চেন্ট_আইডি' কলামটির নাম 'বিজনেস_আইডি' করতে হয়েছে। অন্যথায় আমি 'Business_stat.merchant_id' এর মতো 'Business.id' এর দিকে ইঙ্গিত করে কলামগুলি দিয়ে শেষ করতাম। কলামের পুনরায় নামকরণ সম্পর্কে এখানে একটি ভাল উত্তর।
  • গ্রেপিংয়ের সময়, একক, বহুবচন, মূলধন, ছোট হাতের অক্ষর এবং এমনকী UPPERCASE (যা মন্তব্যে দেখা যেতে পারে) আপনার স্ট্রিংয়ের সংস্করণগুলি অনুসন্ধান করতে ভুলবেন না।
  • প্রথমে বহুবচন সংস্করণগুলি অনুসন্ধান করা ভাল, পরে একক হবে ular এইভাবে যদি আপনার একটি অনিয়মিত বহুবচন থাকে - যেমন আমার বণিকদের :: ব্যবসায়ের উদাহরণে - আপনি সমস্ত অনিয়মিত বহুবচন সঠিক পেতে পারেন can অন্যথায় আপনি শেষ করতে পারেন, উদাহরণস্বরূপ, 'বুসিনেস' (3 টি) এর মধ্যবর্তী রাষ্ট্র হিসাবে, আরও অনুসন্ধান এবং প্রতিস্থাপনের ফলস্বরূপ।
  • অন্ধভাবে প্রতিটি ঘটনা প্রতিস্থাপন করবেন না। যদি আপনার মডেলের নামগুলি সাধারণ প্রোগ্রামিং শর্তাদির সাথে সংঘর্ষ করে, অন্য মডেলের মানগুলির সাথে বা আপনার দৃষ্টিতে পাঠ্য সামগ্রী সহ, আপনি খুব বেশি আগ্রহী হয়ে উঠতে পারেন। আমার উদাহরণে, আমি আমার মডেলটির নামটি 'ব্যবসায়' এ পরিবর্তন করতে চেয়েছিলাম তবে এখনও আমার ইউআই-তে থাকা সামগ্রীতে তাদের 'ব্যবসায়ী' হিসাবে উল্লেখ করেছি। ক্যানক্যানে আমার ব্যবহারকারীদের জন্য আমারও 'বণিক' ভূমিকা ছিল - এটি বণিকের ভূমিকা এবং বণিক মডেলের মধ্যে বিভ্রান্তি ছিল যা আমাকে প্রথম স্থানে মডেলটির নামকরণ করতে বাধ্য করেছিল।

26

আপনাকে আপনার সূচিগুলিও প্রতিস্থাপন করতে হবে:

class RenameOldTableToNewTable< ActiveRecord:Migration
  def self.up
    remove_index :old_table_name, :column_name
    rename_table :old_table_name, :new_table_name
    add_index :new_table_name, :column_name
  end 

  def self.down
    remove_index :new_table_name, :column_name
    rename_table :new_table_name, :old_table_name
    add_index :old_table_name, :column_name
  end
end

এবং নিজের ফাইলগুলি ইত্যাদির পুনরায় নামকরণ করুন, ম্যানুয়ালি অন্য উত্তরগুলি এখানে বর্ণনা করে।

দেখুন: http://api.rubyonrails.org/classes/ActtiveRecord/Migration.html

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

এছাড়াও: হ্যাড_ বা স্বত্ব_ বা কোনও কিছুর দ্বারা নির্ধারিত অন্যান্য টেবিলগুলিতে যে কোনও প্রাসঙ্গিক কলামের নামের জন্য স্কিমা_ডিবি পরীক্ষা করে দেখুন। আপনার সম্ভবত এগুলি সম্পাদনা করতে হবে।

এবং অবশেষে, কোনও রিগ্রেশন টেস্ট স্যুট ছাড়াই এটি করা বাদাম হবে।


11
রেল হিসাবে 4.0.0.beta1 স্থানান্তর, ম্যানুয়ালি সূচকগুলি আপডেট করার প্রয়োজন নেই necessary এআর নিজে এটি আপডেট করে।
ফ্রিম্যানয়েড

1

আপনি এই আদেশটি কার্যকর করতে পারেন: রেল g মাইগ্রেশন পুনর্নবীকরণ_ {পুরানো_সারণযোগ্য_নাম} থেকে {নতুন_তালিকা_র নাম}

আপনি ফাইলটি সম্পাদনা করার পরে এবং পদ্ধতি পরিবর্তনতে এই কোড যুক্ত করুন

পুনঃনামকরণযোগ্য: {পুরানো_সারণযোগ্য_নাম},: {নতুন_সারণযোগ্য_নাম}

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