Rails移行を使用して列を削除する方法


回答:


917
remove_column :table_name, :column_name

例えば:

remove_column :users, :hobby

ユーザーテーブルから趣味の列を削除します。


9
また、@ Powersの回答で説明されているように、内updownはなくメソッド内でこれを実行changeしてください。
XåpplI'-I0llwlg'I -

7
@XåpplI'-I0llwlg'I-コメントをありがとう。changeメソッドはRails 4アプリケーションで列をドロップするために使用できますが、Rails 3では使用しないでください。私はそれに応じて回答を更新しました。
2013年

9
タイプを指定すると移行を元に戻すことができるためremove_column :table_name, :column_name, :type, :optionschangeメソッド内でも使用できます。ドキュメントから:ザ・type及びoptionsパラメータが存在する場合、無視されます。移行のchangeメソッドでこれらを提供すると、元に戻すことができるので便利です。その場合、type及びoptionsADD_COLUMNによって使用されるであろう。
ニコラ

24
Rails4では、changeメソッドで列を削除できますが、列タイプを指定した場合のみです。例えばremove_column, :table_name, :column_name, :column_type。移行を実行しようとしたときそうしないと、次のエラーを取得します:remove_column is only reversible if given a type
デニス・


371

古いバージョンのRailsの場合

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Rails 3以降の場合

rails generate migration RemoveFieldNameFromTableName field_name:datatype

18
「rails g」は「rails generate」の代わりに使用できます
Noz

44
rails g migration remove_field_name_from_table_name field_name:datatypeまた動作します
Stuart Nelson

6
ことにも留意されたいDATA_TYPE、および適切なADD_COLUMNとremove_column文を作成する:filed_nameのホワイト離間リストを続けることができる単一のマイグレーションを使用して2つの属性を除去します。また、メソッドではサポートされていないため、およびの両方を記述する必要があります。AddXXXtoTTTRemoveXXXFromTTTrails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integerremove_columnchangeupdown
Claudio Floreani 2013

3
Rails 4はこれをサポートchangeしているようです。ロールバックは正常に機能します。
Unknown_Guy 2013

2
@AdamGrant 元に戻すchangeことができるメソッドを使用している場合*、データ型(および他のすべてのフィールド修飾子)に通知する必要があるため、その移行をロールバックすると、フィールドを正しく再作成できると思います。*元に戻すと言うと、それはもちろんデータベース構造の観点からです。もちろん、その列のデータは失われます。
RFVoltolini 2017年

117

Rails 4が更新されたため、変更メソッドを移行で使用して列を削除でき、移行は正常にロールバックされます。Rails 3アプリケーションについては、次の警告をお読みください。

Rails 3警告

このコマンドを使用するときは、次のことに注意してください。

rails generate migration RemoveFieldNameFromTableName field_name:datatype

生成された移行は次のようになります。

  def up
    remove_column :table_name, :field_name
  end

  def down
    add_column :table_name, :field_name, :datatype
  end

データベーステーブルから列を削除するときは、changeメソッドを使用しないようにしてください(Rails 3アプリの移行ファイルで不要なものの例):

  def change
    remove_column :table_name, :field_name
  end

Rails 3の変更方法は、remove_columnに関してはスマートではないため、この移行をロールバックすることはできません。


3
次にrake db:migrateを実行します
roxdurazo 2015年

1
@Powers-素晴らしく明確な答え-次の点について詳しく説明できますか:「remove_columnに関しては、Rails 3の変更メソッドはスマートではないため、この移行をロールバックすることはできません。」
BKSpurgeon 2016年

1
@BKSpurgeon-Rails 3では、changeメソッドを使用すると、rake db:rollbackコマンドはエラーになります。 rake db:rollback基本的にの反対ですrake db:migrate。このバグはRails 4で修正されました:)
Powers

2
Rails 4では、変更ドロップ列をロールバックしようとしました。これは失敗し、data_typeを指定する必要があることを示します(回答のダウンコードのように)
rmcsharry

1
@rmcsharryと同じ問題が発生しました。私のレールのバージョンは4.2.2で、変更方法を使用しました。ロールバックしようとすると、型が指定されている場合にだけremove_columnを元に戻せるというエラーが発生しました。
M.ハビブ

38

rails4アプリでは、changeメソッドを使用して列を削除することもできます。3番目のパラメーターはdata_typeで、オプションの4番目ではオプションを指定できます。これは、ドキュメントの「利用可能な変換」セクションに少し隠されています

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end

27

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

remove_column

次のように、単にremove_columnを使用できます。

remove_column :users, :first_name

スキーマに1つの変更を加えるだけでよい場合は、これで問題ありません。

change_tableブロック

次のように、change_tableブロックを使用してこれを行うこともできます。

change_table :users do |t|
  t.remove :first_name
end

読みやすく、一度に複数の変更を加えることができるので、私はこれを好みます。

サポートされているchange_tableメソッドの完全なリストは次のとおりです。

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table


15

Rails 5では、ターミナルでこのコマンドを使用できます:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

たとえば、テーブルusersから列access_level(string)を削除するには:

rails generate migration remove_access_level_from_users access_level:string

次に実行します:

rake db:migrate

14

移行を生成して列を削除し、それが移行(rake db:migrate)された場合、列ドロップするようにします。そして、この移行がロールバックされた場合、列追加する必要がありますrake db:rollback)。

構文:

remove_column:table_name、:column_name、:type

列を削除し、移行がロールバックされた場合に列を追加します

例:

remove_column :users, :last_name, :string

data_typeをスキップすると、移行によって列が正常に削除されますが、移行をロールバックするとエラーがスローされます。


13

Rails 5.2の明確でシンプルな指示

  • 警告:データベースから列を削除すると、データが失われます。続行するには、以下を参照してください:
  • 警告:以下の手順は簡単な移行を対象としています。数百万行などの複雑な移行の場合、失敗の可能性を考慮し、移行を最適化して迅速に実行する方法、およびユーザーがアプリを使用している可能性についても考慮する必要があります。移行プロセスが発生しています。複数のデータベースがある場合、またはリモートで複雑なものがある場合は、問題が発生しても私を責めないでください。

1.移行を作成する

端末で次のコマンドを実行します。

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

注:テーブル名は、レールの規則に従って複数形にする必要があります。

例:

私の場合acceptedquotesテーブルから列(ブール値)を削除します。

rails g migration RemoveAcceptedFromQuotes accepted:boolean

ドキュメントを参照してください:テーブルにフィールドを追加/削除するときの規則:

テーブルにフィールドを追加する移行を生成するための特別な構文ショートカットがあります。

railsはマイグレーションadd_fieldname_to_tablename fieldname:fieldtypeを生成します

2.移行を確認する

# db/migrate/20190122035000_remove_accepted_from_quotes.rb
class RemoveAcceptedFromQuotes < ActiveRecord::Migration[5.2]
  # with rails 5.2 you don't need to add a separate "up" and "down" method.
  def change
    remove_column :quotes, :accepted, :boolean
  end
end

3.移行を実行する

rake db:migrate

....そして、あなたはレースに出かけます!


移行は次のように実行することもできますrails db:migrate
イムランアリ

12

RAILS 5アプリの列を削除する

rails g migration Remove<Anything>From<TableName> [columnName:type]

上記のコマンドは、db/migrateディレクトリ内に移行ファイルを生成します。スニペットブローは、Railsジェネレーターによって生成されたテーブルの例からの列の削除の1つです。

class RemoveAgeFromUsers < ActiveRecord::Migration
  def up
    remove_column :users, :age
  end
  def down
    add_column :users, :age, :integer
  end
end

Railsのクイックリファレンスガイドも作成しましたこちらから入手できます



10
rails g migration RemoveXColumnFromY column_name:data_type

X =列名
Y =テーブル名

編集

変更RemoveXColumnToYRemoveXColumnFromYコメント通り-移行が実際にやっていることのためのより多くの明快さを提供します。


3
「テーブルから削除する」は奇妙に聞こえるので、ここからの方が良い選択のようです。
Sebastian vom Meer

@SebastianvomMeerはい、私は同意します-英語は「from」ではるかによく読みます
BKSpurgeon

8

テーブルから列を削除するには、移行後に実行する必要があります。

rails g migration remove_column_name_from_table_name column_name:data_type

次に、コマンドを実行します。

rake db:migrate

5

独自に移行ファイルに追加する以下のコマンドを与える

rails g migration RemoveColumnFromModel

上記のコマンドを実行した後、移行ファイルを確認できます。remove_columnコードを独自に追加する必要があります。

次に、dbを移行します。

rake db:migrate


5

次の簡単な3つのステップでテーブルから列を削除するには:

  1. このコマンドを書く

rails g migration remove_column_from_table_name

このコマンドをターミナルで実行した後、この名前とタイムスタンプで作成された1つのファイル(remove_column from_table_name)。

次に、このファイルに移動します。

  1. あなたが書かなければならないファイル内

    remove_column :table_name, :column_name

  2. 最後にコンソールに行き、それから

    rake db:migrate



1


remove_column :table_name, :column_name
移行ファイルで

次のように入力して、Railsコンソールで列を直接削除できます。
ActiveRecord::Base.remove_column :table_name, :column_name


1

このようにしてください。

rails g migration RemoveColumnNameFromTables column_name:type

すなわち rails g migration RemoveTitleFromPosts title:string

とにかく、ActiveRecordは実行時にデータベース列をキャッシュするため、列を削除するとアプリが再起動するまで例外が発生する可能性があるため、ダウンタイムについても考慮することをお勧めします。

参照:強力な移行


1

単に、あなたは列を削除することができます

remove_column :table_name, :column_name

例えば、

remove_column :posts, :comment

1

まず、次のコマンドを実行して移行ファイルを作成します。

rails g migration RemoveAgeFromUsers age:string

次に、プロジェクトのルートディレクトリで、次のコマンドを実行して移行を実行します。

rails db:migrate
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.