ruby-on-rails - 削除 - scaffold テーブル 作成




Ruby on Railsの移行でデータベース列の名前を変更するにはどうすればよいですか? (17)

APIから:

rename_column(table_name, column_name, new_column_name)

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

私は間違ってhased_password代わりにhashed_passwordという列を付けました。

移行を使用してこの列の名前を変更してデータベーススキーマを更新するにはどうすればよいですか?


IMO、この場合は、 rake db:rollback使用する方が効果的です。 次に、移行を編集してrake db:migrateます。 ただし、失うことのない列にデータがある場合は、 rename_columnを使用しrename_column


Ruby on Rails 4の場合:

def change
    rename_column :table_name, :column_name_old, :column_name_new
end

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方法がある場合は、次のchangeします。

def change
    rename_column :table_name, :column_old_name, :column_new_name
end

詳細については、「 Ruby on Rails - 移行またはActive Record Migration」を参照してください



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

移行ファイルを生成する:

rails g migration FixName

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

あなたの意志を行うために移行を編集してください。

class FixName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

あなたのコードが他のコードと共有されていない場合は、 rake db:rollbackだけを実行し、移行時に列名を編集し、 rake db:migrateます。 それでおしまい

また、別の移行を作成して列の名前を変更することもできます

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

それでおしまい。


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

rails g migration rename_hased_password

その編集の後、移行メソッドの次の行を追加します

rename_column :table, :hased_password, :hashed_password

これはトリックを行う必要があります。


列に既にデータが格納されていて本番稼働中の場合は、移行を待っている間に本番環境での停止時間を避けるため、ステップバイステップアプローチをお勧めします。

最初に、db migrationを作成して新しい名前の列を追加し、古い列名の値を入力します。

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

私はこれがもう少しプロセスに関わっていることを認識していますが、私は生産マイグレーションの問題よりもむしろこれを行うでしょう。


別の選択肢として、あなたが移行のアイデアと結婚していない場合、あなたのために名前の変更を自動的に処理するActiveRecordのための魅力的な宝石、Datamapperスタイルがあります。 モデル内の列名を変更するだけです( Model.auto_upgrade!model.rbの一番下に置いてください)とviola! データベースはオンザフライで更新されます。

https://github.com/DAddYE/mini_record

注意:競合を避けるためには、 db / schema.rbをnukeする必要があります

まだベータ段階で、明らかに誰もが魅力的な選択肢ではない(私は現在、問題のない2つの重要でないプロダクションアプリでそれを使用している)


変更を実行しますrails g migration ChangesNameInUsers (または名前を付けたいもの)

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

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

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

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

お役に立てれば :)


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

rename_column :your_table_name, :hased_password, :hashed_password

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

rails g migration ChangeHasedPasswordToHashedPassword

次に、 db/migrateフォルダに生成されたファイルに、 rename_columnを次のようにrename_columnします。

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

私は5.2のレール上にあり、開発者のユーザーの列の名前を変更しようとしています。

rename_columnビットが私のために働いていましたが、 :table_nameという単数形で「User table not found」というエラーがrename_columnされました。 複数は私のために働いた。

rails g RenameAgentinUser

次に、移行ファイルを次のように変更します。

rename_column :users, :agent?, :agent

どこですか? 古い列名です。


 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end

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のアップデート

一方、 updown方法はまだ適用されます。 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を使用すると、物事をちょっと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通常どおりにdb:migrateしてください。

Rails 4のアップデート

列の名前を変更するためにMigrationを作成している間、Rails 4は、上記の答えで述べたように、 down代わりにchangeメソッドを生成します。 生成されるchange方法は次のとおりです。

$ > rails g migration ChangeColumnName

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

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




migration