1541

hased_passwordではなく列の名前を間違えましたhashed_password

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

4

31 に答える 31

2436
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
于 2010-01-02T16:31:20.810 に答える
71

私の意見では、この場合、 を使用してからrake db:rollback移行を編集し、再度 を実行することをお勧めしますrake db:migrate

ただし、列にデータを失いたくない場合は、 を使用しますrename_column

于 2010-01-03T00:55:51.610 に答える
27

「 Active Record Migrations」ドキュメントの「Available Transformations」セクションを参照してください。

rename_column(table_name, column_name, new_column_name):

列の名前を変更しますが、型と内容は保持します。

于 2010-01-02T16:26:03.413 に答える
16

API から:

rename_column(table_name, column_name, new_column_name)

これにより、列の名前が変更されますが、型と内容は同じままです。

于 2011-02-18T11:15:59.200 に答える
12

Ruby on Rails の一部のバージョンでは、移行用のup/メソッドがサポートされています。移行に/メソッドdownがある場合は、次のようになります。updown

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を参照してください。

于 2014-02-14T10:38:18.910 に答える
12

コードが他のコードと共有されていない場合、最適なオプションはrake db:rollback 、移行とrake db:migrate. それでおしまい

また、別の移行を記述して、列の名前を変更できます

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

それでおしまい。

于 2013-12-04T14:34:30.590 に答える
9

別のオプションとして、移行のアイデアに慣れていない場合は、名前の変更を自動的に処理する Datamapper スタイルの ActiveRecord の魅力的な gem があります。モデルの列名を変更するだけで、必ずModel.auto_upgrade!model.rb と viola の一番下に置いてください! データベースはオンザフライで更新されます。

https://github.com/DAddYE/mini_recordを参照

db/schema.rb注:衝突を防ぐために、nuke する必要があります。

まだベータ段階であり、明らかに万人向けではありませんが、それでも魅力的な選択肢です。私は現在、問題なく2つの重要な本番アプリで使用しています.

于 2012-01-30T20:00:58.940 に答える
8

列名を切り替える必要がある場合は、「重複する列名」エラーを回避するためにプレースホルダーを作成する必要があります。次に例を示します。

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
于 2013-09-09T21:10:38.723 に答える
7

現在のデータが重要でない場合は、次を使用して元の移行を削除できます。

rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'

引用符なしで、元の移行に変更を加え、次の方法で移行を再度実行します。

rake db:migrate
于 2013-07-26T09:11:47.923 に答える
6

移行ファイルを生成します。

rails g migration FixName

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

移行を編集して、あなたの意志を実行します。

class FixName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end
于 2015-12-28T13:24:46.800 に答える
5

実行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名前がデータベースで実際に変更されているかどうかを確認するために、あなたのをチェックしてください!

お役に立てれば :)

于 2016-12-23T16:10:36.473 に答える
5

手動では、以下の方法を使用できます。

次のように移行を手動で編集できます。

  • 開けるapp/db/migrate/xxxxxxxxx_migration_file.rb

  • hased_passwordに更新hashed_password

  • 以下のコマンドを実行します

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

次に、移行を削除します。

$> rake db:migrate:up VERSION=xxxxxxxxx

更新された変更で移行が追加されます。

于 2014-07-14T13:58:02.407 に答える
4

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
于 2016-01-26T12:26:29.320 に答える
4
$:  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
于 2016-03-23T05:49:28.533 に答える
2

これを行うには 2 つの方法があります。

  1. このタイプでは、ロールバック時にそのリバース コードが自動的に実行されます。

    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
  2. この型に対しては、次の場合に 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
    
于 2015-01-29T10:47:43.170 に答える
1

create_tableisの近縁種で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
于 2016-05-21T05:32:00.123 に答える