রেলগুলিতে নামকরণ টেবিল


154

আমি একটি টেবিলের নাম পরিবর্তন করতে চাই ... (যে কোনও টেবিল))

আমি কোডের এই লাইনটি চেষ্টা করেছি:

ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name)

এই আজব জিনিস। আমি জানি যে আমি এটি প্রথমবারের মতো কাজ করেছি, তবে এখন আমি এই ত্রুটিটি পেয়েছি: অ্যাক্টিভেকর্ডের :: অপরিবর্তিত পদ্ধতি `পুনর্নবীকরণ_সারণযোগ্য :: সংযোগআডাপ্টারস :: স্কিমাস্টেটমেন্টস: মডিউল

আমার কিছু সেট করার দরকার ছিল?

উত্তর:


248

আপনি মাইগ্রেশনে সাধারণত এই ধরণের জিনিসটি করতেন:

class RenameFoo < ActiveRecord::Migration
  def self.up
    rename_table :foo, :bar
  end

  def self.down
    rename_table :bar, :foo
  end
end

1
ধন্যবাদ যে কাজ! আমি এখনও বিস্মিত হয়েছি কেন আগের লাইনে এটি করা হয়নি। ওহ ভাল ..
টমি

@ টমি, rename_tableপদ্ধতিটি সংজ্ঞায়িত করা হয়েছে ActiveRecord::ConnectionAdapters::SchemaStatements। এটি অন্য মডিউলগুলিতে মিশ্রিত হওয়ার অর্থ। আপনি যদি এটি সরাসরি চালাতে চান তবে আমার মনে হয় আপনি করতে পেরেছিলেনinclude ActiveRecord::ConnectionAdapters::SchemaStatements; rename_table :foo, :bar
ক্যাম

অথবা আপনি যদি এত ঝুঁকে থাকেন তবে আপনি অ্যাক্টিভেকর্ড :: মাইগ্রেশন.রেনেম_টিটেল (: foo,: বার) ব্যবহার করতে পারেন। তবে মাইগ্রেশন সবচেয়ে ভাল কাজ করে। আপনি কি মডেলটির নাম পরিবর্তন করতে চান বা মডেলটির নামটি পুরনো হিসাবে ধরে রাখতে চান? যদি তাই হয় তবে আপনি "সেট_সারণযোগ্য_নাম: বার" ব্যবহার করে অ্যাক্টিভেকর্ড মডেলটিতে টেবিলের নামটি নির্দিষ্ট করতে চাইতে পারেন।
আদিত্য সংঘী

1
আপনি উপরের পরিবর্তে 'পরিবর্তন' পদ্ধতিটি সহ মাইগ্রেশনের জন্য নতুন ফর্মটিও ব্যবহার করতে পারেন। উদাহরণস্বরূপ
মেগাটাক্স

ডিএফ পরিবর্তন, ডিএফ সেল্ফ.আপ / ডিফেল্ট.ডাউন। আধুনিক রেল বাস্তবায়নের ক্ষেত্রে নয়। পরেরটি করা নিঃশব্দে ব্যর্থ হবে।
huertanix

294

মনে রাখবেন যে কারাগারে> = 3.1 এ আপনি changeপদ্ধতিটি ব্যবহার করতে পারেন ।

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

37
এই থেকে কোন ইনডেক্স মাইগ্রেট হবে :old_table_nameথেকে:new_table_name
গেভিন মিলার

7
কেবলমাত্র একটি সামান্য মন্তব্য: সম্ভবত পরিবর্তন করুন: ওল্ড_নাম_সামগ্রী,: নতুন_নাম_ত্যাগগুলি লোকেদের মনে করিয়ে দেওয়ার জন্য যে অ্যাক্টিভেকর্ডে থাকা টেবিলের নামগুলি সাধারণত বহুবচন করা হয়।
কার্পেলা

24

.rename_tableএকটি উদাহরণ পদ্ধতি, কোনও শ্রেণিবদ্ধ পদ্ধতি নয়, তাই কলিং Class.methodকাজ করে না। এর পরিবর্তে আপনি ভালো দৃষ্টান্ত উপর ক্লাসের একটা নিদর্শন পদ্ধতি তৈরি, এবং ডাকতে ভালবাসি, থাকবে না: Class.new.method

[সম্পাদনা] এই উদাহরণস্বরূপ, ActiveRecord::ConnectionAdapters::SchemaStatementsএমনকি কোনও শ্রেণিও নয় (ক্যামের দ্বারা নির্দেশিত), এর অর্থ হল যে আমি উপরে যা বলেছি তা অনুসারে আপনি এটির কোনও উদাহরণও তৈরি করতে পারবেন না। এমনকি আপনি যদি ক্যামের উদাহরণ ব্যবহার করেন class Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;, এটি এখনও rename_tableব্যতিক্রম হিসাবে কাজ করবে না ।

অন্যদিকে, ActiveRecord::ConnectionAdapters::MysqlAdapter এটি একটি শ্রেণি, এবং সম্ভবত এই শ্রেণিটি আপনার টেবিলটির নাম পরিবর্তন করতে (বা এসকিউএলাইট বা পোস্টগ্রিএসকিউএল, আপনি কী ডেটাবেস ব্যবহার করছেন তার উপর নির্ভর করে) ব্যবহার করতে হবে। এখন, যেমনটি ঘটে ActiveRecord::ConnectionAdapters::MysqlAdapterএরই মধ্যে এটি ইতিমধ্যে অ্যাক্সেসযোগ্য Model.connection, সুতরাং Model.connection.rename_tableআপনার অ্যাপ্লিকেশনটিতে কোনও মডেল ব্যবহার করে আপনার সম্পূর্ণরূপে সক্ষম হওয়া উচিত । [/ Edit]

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

# Commandline
rails generate migration rename_my_table

# In db/migrate/[timestamp]_rename_my_table.rb:
class RenameMyTable < ActiveRecord::Migration
  def self.up
    rename_table :my_table, :my_new_table
  end

  def self.down
    rename_table :my_new_table, :my_table
  end
end

তারপরে, আপনি নিজের স্থানান্তর rake db:migrate(যা self.upপদ্ধতিটি কল করে ) দিয়ে চালাতে পারেন এবং মাইগ্রেশনটি পূর্বাবস্থায় ফেলার জন্য rake db:rollback(যা কল করে self.down) ব্যবহার করতে পারেন ।


আমি সম্মতি জানাই যে rename_tableএটি একটি উদাহরণ পদ্ধতি, তবে এটি কোনও শ্রেণিতে সংজ্ঞায়িত করা হয়নি, সুতরাং আপনার কল করার পরামর্শটি কার্যকর Class.new.methodহবে না (উদাহরণস্বরূপ: অ্যাক্টিভেকর্ডের জন্য :: ActiveRecord::ConnectionAdapters::SchemaStatements.newত্রুটিটি oMethodError: undefined method নতুন দেয় : সংযোগআডাপ্টার :: স্কিমাস্টেটমেন্টস: মডিউল
ক্যাম

1
আরও উল্লেখ করার মতো, আপনার যদি টেবিলের সাথে কোনও মডেল যুক্ত থাকে তবে আপনি নাম পরিবর্তন করছেন, চালাচ্ছেন rake db:migrateবা মডেল rake db:rollback.rb ফাইলটির নাম পরিবর্তন করবেন না। আপনাকে নিজেই মডেল.আরবি ফাইলটি পরিবর্তন করতে হবে।
মোনকিজ

1
নতুন রেল সংস্করণগুলিতে (উদাহরণস্বরূপ 5.x) আপনি সেলফ.আপ এবং সেলফ ডাউনের পরিবর্তে একটি পরিবর্তন পদ্ধতি ব্যবহার করতে পারেন , কারণ এর মাধ্যমেও রেলগুলি রোলব্যাক করতে পারে। তাই এই কোড যথেষ্ট: def change rename_table :my_table, :my_new_table end। । । । । যাইহোক: এর ভিতরে changeআপনি একটি এই কমান্ড ব্যবহার করুন: add_column, add_index, add_timestamps, create_table, remove_timestamps, rename_column, rename_index,rename_table
সৌন্দর্য

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