web-dev-qa-db-ja.com

Ruby on Railsマイグレーションでデータベース列の名前を変更するにはどうすればいいですか?

列の名前をhased_passwordではなく誤ってhashed_passwordとしています。

移行を使用してこの列の名前を変更し、データベーススキーマを更新する方法を教えてください。

1374
user1994764
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メソッドはまだ適用されます。 Rails 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を使って物事を少しきれいにすることができます。

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

それから、いつものようにdb:migrateを入力してください。


Rails 4に対する更新

列の名前を変更するためのMigrationの作成中に、Rails 4は上記の回答で述べたchangeおよびupの代わりにdownメソッドを生成します。生成されたchangeメソッドは以下のとおりです。 

$ > Rails g migration ChangeColumnName

これにより、次のような移行ファイルが作成されます。

class ChangeColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end
2167
nowk

この場合、IMOはrake db:rollbackを使用してください。その後、移行を編集して、もう一度rake db:migrateと入力します。ただし、データを失いたくない場合は、rename_columnを使用します。

67
elf.xf

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

Available Transformationsの下

rename_column(table_name, column_name, new_column_name):

列の名前を変更しますが、種類と内容は保持します。

26
James Manning

列に既にデータが入力されていて実稼働中である場合は、移行を待っている間に実稼働中のダウンタイムを回避するために、段階的なアプローチをお勧めします。

最初に、新しい名前の列を追加し、それらに古い列名の値を入力するためのdb移行を作成します。

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'

それからコミットが本番環境にプッシュされたら、実行します。

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を実行します。

私はこれがプロセスのもう少し複雑であることを理解しています、しかし私はむしろ私の本番移行に問題があるよりこれをしたいです。

24
Paul Pettengill

以下のコマンドを実行して移行ファイルを作成します。

Rails g migration ChangeHasedPasswordToHashedPassword

次に、db/migrateフォルダーに生成されたファイルに、以下のようにrename_columnを書き込みます。

class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
  def change
     rename_column :table_name, :hased_password, :hashed_password
  end
end
16
Shoaib Malik

APIから:

rename_column(table_name, column_name, new_column_name)

列の名前を変更しますが、型と内容は変わりません。

13
super_p

Ruby on Railsのいくつかのバージョンでは、マイグレーションへのアップ/ダウン方式をサポートしています。また、マイグレーションにアップ/ダウン方式がある場合は、

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

詳細については移動することができます:Ruby on Rails - 移行またはアクティブレコード移行.

12
uma

自分のコードが他のコードと共有されていない場合は、rake db:rollback を実行してから移行時に列名を編集し、rake db:migrateを編集することをお勧めします。それでおしまい

そして、列の名前を変更するために別のマイグレーションを書くことができます。 

 def change
    rename_column :table_name, :old_name, :new_name
  end

それでおしまい。

10
sunil

列名を切り替える必要がある場合は、 重複列名エラーを回避するためのプレースホルダを作成する必要があります これが例です:

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
8
Abram

現在のデータが重要ではない場合は、次のようにして元の移行を中止することができます。

rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'

引用符を付けずに元の移行を変更してから、次のようにしてアップ移行を再度実行します。

rake db:migrate
7
dirtydexter

別の選択肢として、あなたが移行のアイデアと結婚していない場合は、名前の変更を自動的に処理するActiveRecord用の説得力のある宝石、Datamapperスタイルがあります。あなたがしなければならないのはあなたのモデルのカラム名を変更すること(そしてあなたのmodel.rbの一番下に Model.auto_upgrade! を必ず入れてください)とviola!データベースはその場で更新されます。 

https://github.com/DAddYE/mini_record

注:競合を防ぐために db/schema.rb を無効にする必要があります。

まだベータ段階にあり、明らかに皆のためではないが、それでも説得力のある選択です(私は現在、問題なく2つの自明ではないプロダクションアプリケーションでそれを使用しています)。

7
Steven Garcia

Ruby on Rails 4の場合:

def change
    rename_column :table_name, :column_name_old, :column_name_new
end
6
Hardik Hardiya

新しい移行を作成するだけで、ブロックで、以下のようにrename_columnを使用します。

rename_column :your_table_name, :hased_password, :hashed_password
6
jon snow

手動で以下の方法を使用できます。

次のように手動で移行を編集できます。

  • app/db/migrate/xxxxxxxxx_migration_file.rbを開く

  • hased_passwordhashed_passwordに更新

  • 下記のコマンドを実行する

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

その後、移行が削除されます。

$> rake db:migrate:up VERSION=xxxxxxxxx

更新された変更で移行が追加されます。

5
Sumit Munot

Rails g migration ChangesNameInUsersを実行してください(あるいはそれに名前を付けたいものは何でも)

生成されたばかりの移行ファイルを開き、メソッドに次の行を追加します(def changeendの間)。

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

ファイルを保存して、コンソールでrake db:migrateを実行します

データベースで実際に名前が変更されているかどうかを確認するには、schema.dbを調べてください。

お役に立てれば :)

4
Maddie

移行ファイルを生成します。

Rails g migration FixName

#db/migrate/xxxxxxxxxx.rbを作成します

あなたの意思を実行するために移行を編集します。

class FixName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end
4
vipin
$:  Rails g migration RenameHashedPasswordColumn
invoke  active_record
      create    db/migrate/20160323054656_rename_hashed_password_column.rb

その移行ファイルを開き、そのファイルを次のように変更します(元のtable_nameを入力してください)。

class  RenameHashedPasswordColumn < ActiveRecord::Migration
  def change
    rename_column :table_name, :hased_password, :hashed_password
  end
end
4
Prabhakar
 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end
3
Apoorv

Ruby on Railsへの移行を生成する

$:> Rails g migration Fixcolumnname

移行ファイルにコードを挿入する(XXXXXfixcolumnname.rb)

class Fixcolumnname < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end
3
vipin

これを行うには2つの方法があります。

  1. このタイプでは、ロールバック時に自動的に逆のコードを実行します。

    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
  2. このタイプでは、rake db:migrateの場合はupメソッドを実行し、rake db:rollbackの場合はdownメソッドを実行します。

    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
    
2
Sarwan Kumar

Ruby on Railsコンソールを開き、次のように入力します。

ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
2
rinold simon

私はRails 5.2を使っていて、工夫したユーザーの列の名前を変更しようとしています。

rename_columnビットは私のために働きました、しかし、単数の:table_nameは "User table not found"エラーを投げました。複数の私のために働いた。

Rails g RenameAgentinUser

それからマイグレーションファイルをこれに変更してください。

rename_column :users, :agent?, :agent

どこで:エージェント?古い列名です。

1
tomb

KISS 。それでは、3つの簡単なステップを踏んでください。以下は Rails 5.2 に対して有効です。

1。移行を作成する

  • Rails g migration RenameNameToFullNameInStudents

  • Rails g RenameOldFieldToNewFieldInTableName - そのようにして、後でコードベースのメンテナに明らかになります(テーブル名には複数形を使用してください)。

2.移行を編集します

# I prefer to explicitly write theupanddownmethods.

# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb

class RenameNameToFullNameInStudents < ActiveRecord::Migration[5.2]
  def up
    # rename_column :table_name, :old_column, :new_column
    rename_column :students, :name, :full_name
  end

  def down
            # Note that the columns are reversed
    rename_column :students, :full_name, :name
  end
end

3.移行を実行します

rake db:migrate

そして、あなたはレースに出かけています!

0
BKSpurgeon

コマンドを使用して移行を生成するだけです 

Rails g migration rename_hased_password

その後、移行を編集し、変更方法に以下の行を追加します。

rename_column :table, :hased_password, :hashed_password

これでうまくいくはずです。

0
Ratnam Yadav

Rails 5の移行に関する変更 

例えば: 

Rails gモデル学生の学生名:文字列の年齢:整数

student_name columnを name に変更する場合

注: - - 実行していない場合 Rails db:migrate

次の手順を実行できます 

Rails dモデル学生student_name:文字列年齢:整数

これにより、生成された移行ファイルが削除されます。これで列名を修正できます

レールgモデル学生名:文字列年齢:整数

移行した場合(Rails db:migrate)、列名を変更するための以下のオプション

Rails g migration RemoveStudentNameFromStudent student_name:ストリング

レールの移行AddNameToStudent name:string

0
prasanthrubyist