のhased_password
代わりに誤って列に名前を付けましたhashed_password
。
移行を使用してこの列の名前を変更して、データベーススキーマを更新するにはどうすればよいですか?
のhased_password
代わりに誤って列に名前を付けましたhashed_password
。
移行を使用してこの列の名前を変更して、データベーススキーマを更新するにはどうすればよいですか?
回答:
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
次に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
self.up
とは言えません。移行のコンテキストによって異なります。「反対」を置くだけでは、「正しい」ダウンマイグレーションではない可能性があります。self.down
def self.up
とdef self.down
してdef change
、それがロールバックする方法を知っていますよ。
change
方法は完全な証拠ではないので、複雑な移行に使用する方法up
とdown
方法が多いと思います。
私の意見では、この場合は、を使用してrake db:rollback
から、移行を編集して、もう一度実行することをお勧めしますrake db:migrate
。
ただし、失わないようにするデータが列にある場合は、を使用しますrename_column
。
列にすでにデータが入力されており、運用環境にある場合は、段階的なアプローチをお勧めします。これにより、移行を待機している間の運用環境でのダウンタイムを回避できます。
最初に、新しい名前で列を追加し、古い列名の値を入力する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
して、バックグラウンドで実行します。
これはプロセスに少し関わっていることに気づきましたが、本番環境への移行で問題が発生するよりは、こちらの方がいいと思います。
execute "Update table_name set correct_name_column_one = old_name_column_one"
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
下 Available Transformations
rename_column(table_name, column_name, new_column_name):
列の名前を変更しますが、タイプと内容は保持します。
rename_column
も参照してください。
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-MigrationsまたはActive Record Migrationsを移動してください。
コードが他のコードと共有されていない場合はrake db:rollback
、移行およびで列名を編集することをお勧めしますrake db:migrate
。それでおしまい
そして、列の名前を変更するために別のマイグレーションを書くことができます
def change
rename_column :table_name, :old_name, :new_name
end
それでおしまい。
rake db:rollback
素晴らしい提案です。しかし、あなたが言ったように、移行がまだプッシュされていない場合に限ります。
別のオプションとして、移行のアイデアに慣れていない場合は、名前変更を自動的に処理するActiveRecordの魅力的な宝石、Datamapperスタイルがあります。行うのは、モデルの列名を変更するだけです(そして、model.rbの下部にModel.auto_upgrade!を配置してください)とviola!データベースはその場で更新されます。
https://github.com/DAddYE/mini_record
注:競合を防ぐためにdb / schema.rbをnukeする必要があります
まだベータ段階であり、明らかに誰もが使えるわけではありませんが、それでも説得力のある選択肢です(現在、問題のない2つの重要な製品アプリで使用しています)。
Ruby on Rails 4の場合:
def change
rename_column :table_name, :column_name_old, :column_name_new
end
手動で以下の方法を使用できます:
次のように手動で移行を編集できます。
開いた app/db/migrate/xxxxxxxxx_migration_file.rb
アップデートhased_password
へhashed_password
以下のコマンドを実行します
$> rake db:migrate:down VERSION=xxxxxxxxx
次に、移行を削除します。
$> rake db:migrate:up VERSION=xxxxxxxxx
更新された変更で移行が追加されます。
キスしましょう。必要なのは、3つの簡単なステップだけです。以下はRails 5.2で動作します。
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName
-そうすれば、後でコードベースのメンテナに完全に明確になります。(テーブル名には複数を使用します)。
# I prefer to explicitly write the
アップand
ダウンmethods.
# ./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
rake db:migrate
そして、あなたはレースに出かけています!
$: 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
これには2つの方法があります。
このタイプでは、ロールバック時に自動的に逆のコードが実行されます。
def change
rename_column :table_name, :old_column_name, :new_column_name
end
このタイプでは、upメソッドがrake db:migrate
実行され、downメソッドが実行されrake db:rollback
ます。
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
更新 -create_tableに近いものはchange_tableで、既存のテーブルを変更するために使用されます。create_tableと同様の方法で使用されますが、ブロックに渡されたオブジェクトはより多くのトリックを知っています。例えば:
class ChangeBadColumnNames < ActiveRecord::Migration
def change
change_table :your_table_name do |t|
t.rename :old_column_name, :new_column_name
end
end
end
この方法は、インデックスの削除/追加/インデックスの削除/列の追加など、他の変更方法を使用する場合により効率的です。たとえば、次のようにすることもできます。
# Rename
t.rename :old_column_name, :new_column_name
# Add column
t.string :new_column
# Remove column
t.remove :removing_column
# Index column
t.index :indexing_column
#...
Rails 5移行の変更
例えば:
rails gモデルStudent student_name:string age:integer
student_name列を名前として変更する場合
注:-rails db:migrateを実行しない場合
次の手順を実行できます
rails dモデルStudent student_name:string age:integer
これにより、生成された移行ファイルが削除されます。これで、列名を修正できます
rails g model学生名:string年齢:integer
移行した場合(rails db:migrate)、列名を変更する次のオプション
rails g migration RemoveStudentNameFromStudent student_name:string
rails g migration AddNameToStudent name:string
rails g migration RemoveStudentNameFromStudentS student_name:string
学生は複数です)?