একটি রেল মাইগ্রেশনে বিদ্যমান টেবিলটিতে একটি কলাম যুক্ত করা হচ্ছে


340

আমার একটি ইউজার মডেল রয়েছে যার একটি :emailকলাম দরকার (আমি প্রাথমিক স্তম্ভের সময় সেই কলামটি যুক্ত করতে ভুলে গিয়েছিলাম)।

আমি মাইগ্রেশন ফাইলটি খুললাম এবং যুক্ত t.string :emailকরেছি rake db:migrate, করেছি এবং পেয়েছি NoMethodError। তারপরে আমি লাইনটি যুক্ত করলাম

add_column :users, :email, :string

আবার rake db:migrate, আবার NoMethodError। আমি কি এখানে একটি পদক্ষেপ মিস করছি?

সম্পাদনা করুন: মাইগ্রেশন ফাইলটি এখানে।

class CreateUsers < ActiveRecord::Migration  
  def self.up  
    add_column :users, :email, :string  
    create_table :users do |t|  
      t.string :username  
      t.string :email  
      t.string :crypted_password  
      t.string :password_salt  
      t.string :persistence_token  

      t.timestamps  
    end  
  end  

  def self.down  
    drop_table :users  
  end  
end

উত্তর:


573

যদি আপনি ইতিমধ্যে আপনার আসল মাইগ্রেশন চালিয়েছেন (এটি সম্পাদনা করার আগে), তবে আপনাকে নতুন স্থানান্তর তৈরি করতে rails generate migration add_email_to_users email:stringহবে ( কৌশলটি করবে)। এটি লাইনযুক্ত একটি মাইগ্রেশন ফাইল তৈরি করবে: add_column :users, email, string তারপরে rake db:migrateএটি করুন এবং এটি নতুন কলামটি তৈরি করে নতুন মাইগ্রেশন চালাবে।

আপনি যদি এখনও মাইগ্রেশন চালনা না করেন তবে আপনি এটি সম্পাদনা করতে পারবেন, যেমন আপনি করার চেষ্টা করছেন। আপনার মাইগ্রেশন কোডটি প্রায় নিখুঁত: আপনার কেবল add_columnলাইনটি সম্পূর্ণ সরিয়ে ফেলতে হবে (সেই কোডটি টেবিলটি তৈরি হওয়ার আগে কোনও টেবিলটিতে একটি কলাম যুক্ত করার চেষ্টা করছে এবং t.string :emailযাইহোক যাইহোক আপনার সারণী তৈরিকরণের কোডটি অন্তর্ভুক্ত করার জন্য আপডেট করা হয়েছে )।


6
শুধু পরিষ্কার করার জন্য, আমরা বহুবচন ব্যবহার করি? সুতরাং এটি add_email_to_usersএবং না add_email_to_user?
বেগুনি জ্যাকেট

9
সঠিক। রেলের টেবিলের নামগুলি সর্বদা বহুবচন (ডিবি কনভেনশনগুলির সাথে মেলে)।
ক্যামডেজ

2
আপনি rails db:migrateচূড়ান্ত পদক্ষেপের জন্যও ব্যবহার করতে পারেন ।
ডিলান ভ্যান্ডার বার্গ

টেবিলের কোনও নির্দিষ্ট অবস্থানে নতুন কলাম তৈরি করা কি সম্ভব? উদাহরণস্বরূপ, যদি আমি বিদ্যমান "ইমেল" ক্ষেত্রের ঠিক পরে নতুন ক্ষেত্র "স্থিতি" তৈরি করতে চাই?
নীরজ

2
@ নীরজ আপনার কাছে সম্ভবত এখনই উত্তর রয়েছে তবে অন্যান্য সন্ধানকারীদের কাছে হ্যাঁ আপনি উদাহরণ হিসাবে বলতে পারেন t.string :column_x, limit: 10, after: :column_y(কমপক্ষে 4 টি রেলের জন্য)
244

123

রেল কনসোলে এই কমান্ডটি ব্যবহার করুন

rails generate migration add_fieldname_to_tablename fieldname:string

এবং

rake db:migrate

এই মাইগ্রেশন চালাতে


57

কখনও কখনও rails generate migration add_email_to_users email:stringএইভাবে একটি মাইগ্রেশন উত্পাদন করে

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
  end
end

সেক্ষেত্রে আপনাকে ম্যানুয়ালি একটি add_columnকরতে হবে change:

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :email, :string
  end
end

এবং তারপর চালান rake db:migrate


1) এটি কি টার্মিনালের rails generate migration add_email_to_users email:stringপরে bundle exec rails cবা কেবল চালানো উচিত ? 2) উত্সাহিত ফাইলটি আমরা কোয়েরিটি কার্যকর করার পরে কোথায় স্থাপন করা হবে?
সোফস 1

28

আপনি করতে পারেন

rake db:rollback

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

rake db:migrate

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

এটি করার অনেক সহজ উপায় হ'ল মাইগ্রেশন ফাইলের পরিবর্তন যেমন হয় তেমনি হয়। ব্যবহার

$rake db:migrate:redo

এটি শেষ মাইগ্রেশনটি ফিরিয়ে আনবে এবং এটি আবার স্থানান্তর করবে।


21

একটি কলাম যুক্ত করতে আমাকে এই পদক্ষেপগুলি অনুসরণ করতে হয়েছিল:

  1. rails generate migration add_fieldname_to_tablename fieldname:string

    বিকল্প

    rails generate migration addFieldnameToTablename

    মাইগ্রেশনটি তৈরি হয়ে গেলে, মাইগ্রেশনটি সম্পাদনা করুন এবং সেই কলামটি যুক্ত করতে চান এমন সমস্ত বৈশিষ্ট্য নির্ধারণ করুন।

    দ্রষ্টব্য : কারাগারে থাকা টেবিলের নামগুলি সর্বদা বহুবচন (ডিবি কনভেনশনগুলির সাথে মেলে)। পূর্বে উল্লিখিত পদক্ষেপগুলির একটি ব্যবহার করে উদাহরণ-

    rails generate migration addEmailToUsers

  2. rake db:migrate

অথবা

  1. আপনি এ থেকে স্কিমা পরিবর্তন db/schema.rbকরতে পারেন, এসকিউএল কোয়েরিতে আপনি যে কলামগুলি চান তা যুক্ত করুন।
  2. এই আদেশটি চালান: rake db:schema:load

    সতর্কতা / নোট

    মনে রাখবেন যে, চলমান rake db:schema:loadআপনার টেবিলের সমস্ত ডেটা স্বয়ংক্রিয়ভাবে মুছবে।


আমি এটি করেছি, তবে এটি "ভারা" পুনরায় করা হয়নি এবং নতুন কলামটি যুক্ত করে নি। আমি কীভাবে এটি "স্বয়ংক্রিয়ভাবে" করতে পারি?
জন ওয়াটেন

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

একটি নোট যোগ করতে: মাইগ্রেশন পরিবর্তন না করে স্কিমা পরিবর্তন করা অন্যান্য বিকাশকারীদের অ্যাপ্লিকেশন বজায় রাখার ক্ষেত্রে সমস্যা তৈরি করতে পারে।
বিকেএসপুরগাঁও

3

আমি যখন আসল মাইগ্রেশনকে ঝাঁকুনির পরিবর্তে এটি করেছি, আমি উপরের অংশে কেবল যুক্ত কলাম এবং নীচের অংশে একটি ড্রপ কলাম দিয়ে একটি নতুন তৈরি করব।

আপনি মূল পরিবর্তন করতে পারেন এবং আপনি যদি মাঝখানে স্থানান্তরিত হন তবে এটি পুনরায় চালু করতে পারেন তবে এই ক্ষেত্রে আমি মনে করি এটি এমন একটি স্থানান্তর হয়েছে যা সঠিকভাবে কাজ করবে না।

যেমন পোস্ট করা হয়েছে, আপনি কলামটি যুক্ত করছেন এবং তারপরে সারণীটি তৈরি করছেন।

আপনি যদি অর্ডার পরিবর্তন করেন তবে এটি কার্যকর হতে পারে। অথবা, আপনি যেমন কোনও বিদ্যমান স্থানান্তর সংশোধন করছেন, পৃথক অ্যাড কলাম করার পরিবর্তে এটি তৈরি টেবিলটিতে যুক্ত করুন।


1

আপনি force: trueযদি টেবিলটি ইতিমধ্যে বিদ্যমান থাকেন তবে আপনি টেবিলের টেবিল কলামগুলিতেও জোর করতে পারেন।

উদাহরণ :

ActiveRecord::Schema.define(version: 20080906171750) do
  create_table "authors", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end


0

আপনি দ্বারা শেষ মাইগ্রেশন রোলব্যাক করতে পারেন

rake db:rollback STEP=1

অথবা এই নির্দিষ্ট স্থানান্তর দ্বারা রোলব্যাক করুন

rake db:migrate:down VERSION=<YYYYMMDDHHMMSS>

এবং ফাইলটি সম্পাদনা করুন, তারপরে rake db:mirgateআবার চালান ।


0

আপনি এটিও করতে পারেন .. রেল g মাইগ্রেশন অ্যাড_ কলাম / টু_উজার্স ইমেল: স্ট্রিং

তারপরে রেক ডিবি: মাইগ্রেটও যুক্ত করুন: আপনার ব্যবহারকারী নিয়ামকের ইমেল বৈশিষ্ট্য;

আরও তথ্যের জন্য http://guides.rubyonrails.org/active_record_migrations.html দেখুন


0

আপনি কলামের আগে বা পরে কলামের পরে কোনও নির্দিষ্ট অবস্থানে কলাম যুক্ত করতে পারেন:

rails generate migration add_dob_to_customer dob:date

স্থানান্তর ফাইলটি নিম্নলিখিত কোডগুলি উত্পন্ন করবে পরে: ইমেল except আপনার পরে যুক্ত করতে হবে:: ইমেল বা তার আগে:: ইমেল

class AddDobToCustomer < ActiveRecord::Migration[5.2]
  def change
    add_column :customers, :dob, :date, after: :email
  end
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.