Railsの移行を通じてデータベーステーブルの列を削除するための構文は何ですか?
23 に答える
remove_column :table_name, :column_name
例えば:
remove_column :users, :hobby
ユーザーテーブルから趣味の列を削除します。
Railsの古いバージョンの場合
ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype
Rails3以降の場合
rails generate migration RemoveFieldNameFromTableName field_name:datatype
Rails 4が更新されたため、移行でchangeメソッドを使用して列を削除すると、移行は正常にロールバックされます。Rails3アプリケーションに関する次の警告をお読みください。
Rails3の警告
このコマンドを使用する場合は、次の点に注意してください。
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のchangeメソッドは、remove_columnに関しては賢明ではないため、この移行をロールバックすることはできません。
rails4アプリでは、列の削除にもchangeメソッドを使用できます。3番目のパラメーターはdata_typeであり、オプションの4番目のパラメーターでオプションを指定できます。これは、ドキュメントの「利用可能な変換」のセクションに少し隠されています。
class RemoveFieldFromTableName < ActiveRecord::Migration
def change
remove_column :table_name, :field_name, :data_type, {}
end
end
これを行うには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
Rails5および6の明確でシンプルな手順
- 警告:データが失われます。
- 警告:以下の手順は、簡単な移行用です。数百万行、読み取り/書き込みデータベース、クラスターなどの複雑な移行の場合、このアドバイスは適切ではありません。
1.移行を作成します
ターミナルで次のコマンドを実行します。
rails generate migration remove_fieldname_from_tablename fieldname:fieldtype
注:テーブル名は、railsの規則に従って複数形にする必要があります。
例:
私の場合、テーブルaccepted
から列(ブール値)を削除したいと思います。quotes
rails g migration RemoveAcceptedFromQuotes accepted:boolean
ドキュメントre:テーブルにフィールドを追加/削除するときの規則を参照してください。
テーブルにフィールドを追加する移行を生成するための特別な構文ショートカットがあります。
Railsは移行を生成しますadd_fieldname_to_tablenamefieldname: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
(両方とも同じです)
....そして、あなたはレースに出かけます!
移行を生成して列を削除し、移行された場合(rake db:migrate
)、列を削除するようにします。また、この移行がロールバックされた場合は、列を追加し直すrake db:rollback
必要があります( )。
構文:
remove_column:table_name、:column_name、:type
列を削除し、移行がロールバックされている場合は列を追加し直します。
例:
remove_column :users, :last_name, :string
注:data_typeをスキップすると、移行によって列が正常に削除されますが、移行をロールバックするとエラーがスローされます。
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
RAILS5アプリの列を削除する
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のクイックリファレンスガイドも作成しました。これはここにあります。
rails g migration RemoveXColumnFromY column_name:data_type
X=列名
Y=テーブル名
編集
RemoveXColumnToY
コメントごとに変更RemoveXColumnFromY
-移行が実際に行っていることをより明確にします。
テーブルから列を削除するには、次の移行を実行する必要があります。
rails g migration remove_column_name_from_table_name column_name:data_type
次に、コマンドを実行します。
rake db:migrate
以下のコマンドを実行すると、独自に移行ファイルが追加されます
rails g migration RemoveColumnFromModel
上記のコマンドを実行した後、移行ファイルのremove_columnコードを独自に追加する必要があることを確認できます
次に、データベースを移行します
rake db:migrate
remove_column
inchange
メソッドは、テーブルから列を削除するのに役立ちます。
class RemoveColumn < ActiveRecord::Migration
def change
remove_column :table_name, :column_name, :data_type
end
end
完全なリファレンスについては、このリンクにアクセスしてください:http: //guides.rubyonrails.org/active_record_migrations.html
次のように簡単な3つのステップでテーブルから列を削除します。
- このコマンドを書く
rails g migration remove_column_from_table_name
このコマンドをターミナルで実行した後、この名前とタイムスタンプ(remove_column from_table_name)で作成された1つのファイル。
次に、このファイルに移動します。
あなたが書かなければならないファイルの中に
remove_column :table_name, :column_name
最後にコンソールに移動してから
rake db:migrate
Railsコンソールからもう1つ
ActiveRecord::Migration.remove_column(:table_name, :column_name)
ステップ1:移行を作成する
rails g migration remove_column_name_from_table
ステップ2:作成したばかりのファイル移行のコードを変更する
Railsバージョン<3
def change
remove_column :table_name, :column_name, :datatype
end
Railsバージョン>=3
def change
remove_column :table_name, :column_name
end
ステップ3:移行する
rake db:migrate
簡単に、あなたは列を削除することができます
remove_column :table_name, :column_name
例えば、
remove_column :posts, :comment
まず、次のコマンドを実行して移行ファイルを作成してみてください。
rails g migration RemoveAgeFromUsers age:string
次に、プロジェクトのルートディレクトリで、次のコマンドを実行して移行を実行します。
rails db:migrate
remove_column :table_name, :column_name
移行ファイルを介して
次のように入力すると、Railsコンソールで列を直接削除できます。
ActiveRecord::Base.remove_column :table_name, :column_name
このようにしてください。
rails g migration RemoveColumnNameFromTables column_name:type
つまりrails g migration RemoveTitleFromPosts title:string
とにかく、ActiveRecordは実行時にデータベース列をキャッシュするため、ダウンタイムについても考慮することをお勧めします。列を削除すると、アプリが再起動するまで例外が発生する可能性があります。
参照:強力な移行
- モデルで列を無視としてマークします
class MyModel < ApplicationRecord
self.ignored_columns = ["my_field"]
end
- 移行を生成する
$ bin/rails g migration DropMyFieldFromMyModel
- 移行を編集する
class DropMyFieldFromMyModel < ActiveRecord::Migration[6.1]
def change
safety_assured { remove_column :my_table, :my_field }
end
end
- 移行を実行します
$ bin/rails db:migrate
これをレールコンソールで実行するだけです
ActiveRecord::Base.connection.remove_column("table_name", :column_name, :its_data_type)
また
TableName.find_by_sql(“ALTER TABLE table_name DROP column_name”)