列の名前を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
このトピックを紹介してくれてありがとう、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
この場合、IMOはrake db:rollback
を使用してください。その後、移行を編集して、もう一度rake db:migrate
と入力します。ただし、データを失いたくない場合は、rename_column
を使用します。
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Available Transformations
の下
rename_column(table_name, column_name, new_column_name):
列の名前を変更しますが、種類と内容は保持します。
列に既にデータが入力されていて実稼働中である場合は、移行を待っている間に実稼働中のダウンタイムを回避するために、段階的なアプローチをお勧めします。
最初に、新しい名前の列を追加し、それらに古い列名の値を入力するための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
を実行します。
私はこれがプロセスのもう少し複雑であることを理解しています、しかし私はむしろ私の本番移行に問題があるよりこれをしたいです。
以下のコマンドを実行して移行ファイルを作成します。
Rails g migration ChangeHasedPasswordToHashedPassword
次に、db/migrate
フォルダーに生成されたファイルに、以下のようにrename_column
を書き込みます。
class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
APIから:
rename_column(table_name, column_name, new_column_name)
列の名前を変更しますが、型と内容は変わりません。
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 - 移行またはアクティブレコード移行.
自分のコードが他のコードと共有されていない場合は、rake db:rollback
を実行してから移行時に列名を編集し、rake db:migrate
を編集することをお勧めします。それでおしまい
そして、列の名前を変更するために別のマイグレーションを書くことができます。
def change
rename_column :table_name, :old_name, :new_name
end
それでおしまい。
列名を切り替える必要がある場合は、 重複列名エラーを回避するためのプレースホルダを作成する必要があります これが例です:
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
現在のデータが重要ではない場合は、次のようにして元の移行を中止することができます。
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
引用符を付けずに元の移行を変更してから、次のようにしてアップ移行を再度実行します。
rake db:migrate
別の選択肢として、あなたが移行のアイデアと結婚していない場合は、名前の変更を自動的に処理するActiveRecord用の説得力のある宝石、Datamapperスタイルがあります。あなたがしなければならないのはあなたのモデルのカラム名を変更すること(そしてあなたのmodel.rbの一番下に Model.auto_upgrade! を必ず入れてください)とviola!データベースはその場で更新されます。
https://github.com/DAddYE/mini_record
注:競合を防ぐために db/schema.rb を無効にする必要があります。
まだベータ段階にあり、明らかに皆のためではないが、それでも説得力のある選択です(私は現在、問題なく2つの自明ではないプロダクションアプリケーションでそれを使用しています)。
Ruby on Rails 4の場合:
def change
rename_column :table_name, :column_name_old, :column_name_new
end
新しい移行を作成するだけで、ブロックで、以下のようにrename_column
を使用します。
rename_column :your_table_name, :hased_password, :hashed_password
手動で以下の方法を使用できます。
次のように手動で移行を編集できます。
app/db/migrate/xxxxxxxxx_migration_file.rb
を開く
hased_password
をhashed_password
に更新
下記のコマンドを実行する
$> rake db:migrate:down VERSION=xxxxxxxxx
その後、移行が削除されます。
$> rake db:migrate:up VERSION=xxxxxxxxx
更新された変更で移行が追加されます。
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
を調べてください。
お役に立てれば :)
移行ファイルを生成します。
Rails g migration FixName
#db/migrate/xxxxxxxxxx.rbを作成します
あなたの意思を実行するために移行を編集します。
class FixName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
$: 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
def change
rename_column :table_name, :old_column_name, :new_column_name
end
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
これを行うには2つの方法があります。
このタイプでは、ロールバック時に自動的に逆のコードを実行します。
def change
rename_column :table_name, :old_column_name, :new_column_name
end
このタイプでは、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
Ruby on Railsコンソールを開き、次のように入力します。
ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
私はRails 5.2を使っていて、工夫したユーザーの列の名前を変更しようとしています。
rename_column
ビットは私のために働きました、しかし、単数の:table_name
は "User table not found"エラーを投げました。複数の私のために働いた。
Rails g RenameAgentinUser
それからマイグレーションファイルをこれに変更してください。
rename_column :users, :agent?, :agent
どこで:エージェント?古い列名です。
KISS 。それでは、3つの簡単なステップを踏んでください。以下は Rails 5.2 に対して有効です。
Rails g migration RenameNameToFullNameInStudents
Rails g RenameOldFieldToNewFieldInTableName
- そのようにして、後でコードベースのメンテナに明らかになります(テーブル名には複数形を使用してください)。
# I prefer to explicitly write the
upand
downmethods.
# ./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 rename_hased_password
その後、移行を編集し、変更方法に以下の行を追加します。
rename_column :table, :hased_password, :hashed_password
これでうまくいくはずです。
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