পরিবর্তন কলামের জন্য রেল স্থানান্তর


327

আমরা আছে script/generate migration add_fieldname_to_tablename fieldname:datatypeএকটি মডেল নতুন কলাম যোগ করার জন্য সিনট্যাক্স।

একই লাইনে, একটি কলামের ডেটাটাইপ পরিবর্তন করার জন্য আমাদের কাছে কি কোনও স্ক্রিপ্ট / জেনারেট আছে? নাকি আমার ভ্যানিলা মাইগ্রেশনে সরাসরি এসকিউএল লিখতে হবে?

আমি থেকে একটি কলাম পরিবর্তন করতে চান datetimeকরতে date

উত্তর:


548

আমি এই কাজ করা উচিত।

change_column :table_name, :column_name, :date

13
@ বি_য়ান: যতদূর আমি জানি, মাইগ্রেশন নামের একমাত্র যাদু শব্দগুলি হ'ল "যুক্ত" এবং "অপসারণ"।
অ্যালেক্স কোরবান

1
এখানে রেলগুলি বাছাই করুন, তবে ... আমি উত্তরটি বুঝতে পেরেছি তবে এই উত্তরের মন্তব্য নয়। স্পষ্ট ব্যাখ্যা প্রশংসিত :)
অ্যালান এইচ।

7
আপনি যখন কোনও মাইগ্রেশন তৈরি করবেন, আপনি এটিকে একটি নাম দিন (উদাহরণস্বরূপ উপরের প্রশ্নে add_fieldname_to_tablename)। যদি এটি "যোগ" বা "অপসারণ" দিয়ে শুরু হয় তবে মাইগ্রেশনটি কলামগুলি যুক্ত করতে বা সরিয়ে দেওয়ার জন্য কোড সহ স্বয়ংক্রিয়ভাবে পপুলেশন হবে, যা আপনাকে সেই কোডটি নিজেরাই লেখায় সংরক্ষণ করে।
অ্যালেক্স কোরবান

6
এটি অপরিবর্তনীয় স্থানান্তর হিসাবে যেমন আপনার যথাযথ changeক্রিয়াটি পৃথক updownক্রিয়াকলাপের সাথে প্রতিস্থাপন করা উচিত, এটিও আপনার মনে রাখা উচিত change_columnyou
ডেভস্টেফেন্স 17

1
@ কিপ্যসট্যাক্স আপ-এ আপনার কলামটি যেখান থেকে পরিবর্তন করতে চান তা থাকা উচিত এবং নীচে কীভাবে সেই পরিবর্তনটি বিপরীত করা উচিত।
ডেভস্টেফেন্স 14

98

কোনও টেবিলের মধ্যে পরিবর্তন করতে যদি আপনার একাধিক কলাম থাকে তবে আপনি একটি ব্লকও ব্যবহার করতে পারেন।

উদাহরণ:

change_table :table_name do |t|
  t.change :column_name, :column_type, {options}
end

দেখুন ছক বর্গ উপর এপিআই ডকুমেন্টেশন আরো বিস্তারিত জানার জন্য।


88

আপনি যদি এগুলি করতে কমান্ড লাইন থেকে কোনও স্থানান্তর তৈরি করতে পারেন তবে আমি সচেতন নই তবে আপনি একটি নতুন স্থানান্তর তৈরি করতে পারেন, তারপরে এই টাকগুলি সম্পাদন করার জন্য মাইগ্রেশনটি সম্পাদনা করতে পারেন।

যদি টেবিলের নামটি আপনার টেবিলের নাম হয় তবে ক্ষেত্রের নামটি আপনার ক্ষেত্রের নাম এবং আপনি তারিখ থেকে তারিখে পরিবর্তিত হতে চান, আপনি এটি করার জন্য মাইগ্রেশন লিখতে পারেন।

আপনি এটি দিয়ে একটি নতুন স্থানান্তর তৈরি করতে পারেন:

rails g migration change_data_type_for_fieldname

তারপরে পরিবর্তন_সামগ্রী ব্যবহার করতে মাইগ্রেশন সম্পাদনা করুন:

class ChangeDataTypeForFieldname < ActiveRecord::Migration
  def self.up
    change_table :tablename do |t|
      t.change :fieldname, :date
    end
  end
  def self.down
    change_table :tablename do |t|
      t.change :fieldname, :datetime
    end
  end
end

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

rake db:migrate

32

পূর্ববর্তী উত্তরগুলি হিসাবে আমি খুঁজে পেয়েছি, একটি কলামের ধরণ পরিবর্তন করতে তিনটি পদক্ষেপের প্রয়োজন:

ধাপ 1:

এই কোডটি ব্যবহার করে একটি নতুন মাইগ্রেশন ফাইল তৈরি করুন:

rails g migration sample_name_change_column_type

ধাপ ২:

/db/migrateফোল্ডারে যান এবং আপনার তৈরি মাইগ্রেশন ফাইলটি সম্পাদনা করুন। দুটি ভিন্ন সমাধান আছে।

  1. def change
        change_column(:table_name, :column_name, :new_type)
    end

2।

    def up
        change_column :table_name, :column_name, :new_type
    end

    def down
        change_column :table_name, :column_name, :old_type
    end

ধাপ 3:

এই আদেশটি করতে ভুলবেন না:

rake db:migrate

আমি এই সমাধানটি 4 রেলের জন্য পরীক্ষা করেছি এবং এটি ভাল কাজ করে।


1
পদক্ষেপ 2 এ, প্রথম
রেক

এমন কোনও রেল কনভেনশন রয়েছে যা মাইগ্রেশন ফাইলটিতে না গিয়ে তৈরি করার পরে এডিট করার সময় সবকিছু কমবেশি করার অনুমতি দেয়?
বিকেএসপুরজন

@ বি কে এসপুরজন হ্যাঁ, এখানে ডকুমেন্টেশন চেক করুন: এজগুইডস.আরবায়নরইলস.আর
অ্যাক্টিভ_রেকর্ড_ইমিগ্রেশনস

12

সাথে রেল 5

রেল গাইড থেকে :

যদি আপনি মাইগ্রেশনের জন্য এমন কিছু করতে চান যা অ্যাক্টিভ রেকর্ডটি বিপরীত করতে জানে না, আপনি ব্যবহার করতে পারেন reversible:

class ChangeTablenameFieldname < ActiveRecord::Migration[5.1]
  def change
    reversible do |dir|
      change_table :tablename do |t|
        dir.up   { t.change :fieldname, :date }
        dir.down { t.change :fieldname, :datetime }
      end
    end
  end
end

8

কেবল মাইগ্রেশন উত্পন্ন করুন:

rails g migration change_column_to_new_from_table_name

এর মতো মাইগ্রেশন আপডেট করুন:

class ClassName < ActiveRecord::Migration
  change_table :table_name do |table|
    table.change :column_name, :data_type
  end
end

এবং পরিশেষে

rake db:migrate

2

মাইগ্রেশন ব্যবহার করে ডেটা ধরণের পরিবর্তন করার আরেকটি উপায়

পদক্ষেপ 1: আপনাকে মাইগ্রেশন ব্যবহার করে ত্রুটিযুক্ত ডেটা টাইপের ক্ষেত্রের নামটি সরিয়ে ফেলতে হবে

উদা:

rails g migration RemoveFieldNameFromTableName field_name:data_type

এখানে আপনার ক্ষেত্রের জন্য ডেটা টাইপ নির্দিষ্ট করতে ভুলবেন না

পদক্ষেপ 2: এখন আপনি সঠিক ডেটা টাইপ সহ ফিল্ড যুক্ত করতে পারেন

উদা:

rails g migration AddFieldNameToTableName field_name:data_type

এটাই, এখন আপনার টেবিলটি সঠিক ডেটা টাইপ ফিল্ড যুক্ত করবে, হ্যাপি রুবি কোডিং !!


2

এটি সমস্তই ধরে নিচ্ছে যে কলামের ডেটাটাইপটি কোনও বিদ্যমান ডেটার জন্য অন্তর্নিহিত রূপান্তর রয়েছে। আমি বেশ কয়েকটি পরিস্থিতিতে ছুঁড়েছি যেখানে বিদ্যমান ডেটা, আসুন আমরা বলি যে একটি Stringস্পষ্টভাবে নতুন ডেটাটাইপে রূপান্তর করা যেতে পারে, আসুন বলি Date

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

/app/models/table.rb
  ...
  def string_to_date
    update(new_date_field: date_field.to_date)
  end

  def date_to_string
    update(old_date_field: date_field.to_s)
  end
  ...
    def up
        # Add column to store converted data
        add_column :table_name, :new_date_field, :date
        # Update the all resources
        Table.all.each(&:string_to_date)
        # Remove old column
        remove_column :table_name, :date_field
        # Rename new column
        rename_column :table_name, :new_date_field, :date_field
    end

    # Reversed steps does allow for migration rollback
    def down
        add_column :table_name, :old_date_field, :string
        Table.all.each(&:date_to_string)
        remove_column :table_name, :date_field
        rename_column :table_name, :old_date_field, :date_field
    end

0

সম্পাদনা ডিফল্ট মান ক্ষেত্রে উত্তর সম্পূর্ণ করতে :

আপনার রেল কনসোলে:

rails g migration MigrationName

মাইগ্রেশনে:

  def change
    change_column :tables, :field_name, :field_type, default: value
  end

দেখতে হবে:

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