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」を参照してください 。
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Available Transformations
rename_column(table_name, column_name, new_column_name):
列の名前を変更しますが、型と内容は保持します。
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 change
とend
間)。
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のアップデート
一方、 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
を使用すると、物事をちょっと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