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
「別の down メソッドを記述する必要なく、データベースを移行し、移行がロールバックされたときに元に戻す方法を知っている」メソッドを受け取ります。
詳細については、「Active Record Migrations」を参照してください。
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
私の意見では、この場合、 を使用してからrake db:rollback
移行を編集し、再度 を実行することをお勧めしますrake db:migrate
。
ただし、列にデータを失いたくない場合は、 を使用しますrename_column
。
「 Active Record Migrations」ドキュメントの「Available Transformations」セクションを参照してください。
rename_column(table_name, column_name, new_column_name):
列の名前を変更しますが、型と内容は保持します。
API から:
rename_column(table_name, column_name, new_column_name)
これにより、列の名前が変更されますが、型と内容は同じままです。
Ruby on Rails の一部のバージョンでは、移行用のup
/メソッドがサポートされています。移行に/メソッドdown
がある場合は、次のようになります。up
down
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
それでおしまい。
別のオプションとして、移行のアイデアに慣れていない場合は、名前の変更を自動的に処理する Datamapper スタイルの ActiveRecord の魅力的な gem があります。モデルの列名を変更するだけで、必ずModel.auto_upgrade!
model.rb と viola の一番下に置いてください! データベースはオンザフライで更新されます。
https://github.com/DAddYE/mini_recordを参照
db/schema.rb
注:衝突を防ぐために、nuke する必要があります。
まだベータ段階であり、明らかに万人向けではありませんが、それでも魅力的な選択肢です。私は現在、問題なく2つの重要な本番アプリで使用しています.
列名を切り替える必要がある場合は、「重複する列名」エラーを回避するためにプレースホルダーを作成する必要があります。次に例を示します。
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
移行ファイルを生成します。
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 ChangesNameInUsers
(または任意の名前を付けます)
生成されたばかりの移行ファイルを開き、メソッドに次の行を追加します ( と の間def change
) end
:
rename_column :table_name, :the_name_you_want_to_change, :the_new_name
ファイルを保存rake db:migrate
し、コンソールで実行します
schema.db
名前がデータベースで実際に変更されているかどうかを確認するために、あなたのをチェックしてください!
お役に立てれば :)
手動では、以下の方法を使用できます。
次のように移行を手動で編集できます。
開けるapp/db/migrate/xxxxxxxxx_migration_file.rb
hased_password
に更新hashed_password
以下のコマンドを実行します
$> rake db:migrate:down VERSION=xxxxxxxxx
次に、移行を削除します。
$> rake db:migrate:up VERSION=xxxxxxxxx
更新された変更で移行が追加されます。
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 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
isの近縁種で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
この方法は、削除/インデックスの追加/インデックスの削除/列の追加などの他の変更方法と併用するとより効率的です。次のようなことができます。
名前を変更
t.rename :old_column_name, :new_column_name
列を追加
t.string :new_column
列を削除
t.remove :removing_column
索引列
t.index :indexing_column