回答:
これでうまくいくと思います。
change_column :table_name, :column_name, :date
change
別々とアクションup
とdown
同様に、アクションをchange_column
不可逆的な移行があると、あなたがロールバックする必要がある場合、エラーが発生します。
テーブル内で変更する列が複数ある場合は、ブロックを使用することもできます。
例:
change_table :table_name do |t|
t.change :column_name, :column_type, {options}
end
詳細については、TableクラスのAPIドキュメントを参照してください。
コマンドラインから移行を作成してこれをすべて実行できるかどうかはわかりませんが、新しい移行を作成してから、移行を編集してこのタスクを実行できます。
tablenameがテーブルの名前で、fieldnameがフィールドの名前で、日時から日付に変更したい場合は、移行を作成してこれを行うことができます。
以下を使用して新しい移行を作成できます。
rails g migration change_data_type_for_fieldname
次に、change_tableを使用するように移行を編集します。
class ChangeDataTypeForFieldname < ActiveRecord::Migration
def self.up
change_table :tablename do |t|
t.change :fieldname, :date
end
end
def self.down
change_table :tablename do |t|
t.change :fieldname, :datetime
end
end
end
次に、移行を実行します。
rake db:migrate
以前の回答で見つけたように、列のタイプを変更するには3つのステップが必要です。
ステップ1:
次のコードを使用して、新しい移行ファイルを生成します。
rails g migration sample_name_change_column_type
ステップ2:
/db/migrate
フォルダーに移動し、作成した移行ファイルを編集します。2つの異なるソリューションがあります。
def change
change_column(:table_name, :column_name, :new_type)
end
2。
def up
change_column :table_name, :column_name, :new_type
end
def down
change_column :table_name, :column_name, :old_type
end
ステップ3:
このコマンドを実行することを忘れないでください:
rake db:migrate
このソリューションをRails 4でテストしましたが、うまく機能します。
Railsガイドから:
Active Recordがリバースする方法を知らない何かをするマイグレーションに望むならば、あなたは使うことができます
reversible
:
class ChangeTablenameFieldname < ActiveRecord::Migration[5.1]
def change
reversible do |dir|
change_table :tablename do |t|
dir.up { t.change :fieldname, :date }
dir.down { t.change :fieldname, :datetime }
end
end
end
end
移行を使用してデータ型を変更する別の方法
ステップ1: 移行を使用して、エラーが発生したデータ型のフィールド名を削除する必要があります
例:
rails g migration RemoveFieldNameFromTableName field_name:data_type
ここで、フィールドのデータ型を指定することを忘れないでください
ステップ2: 正しいデータ型のフィールドを追加できるようになりました
例:
rails g migration AddFieldNameToTableName field_name:data_type
以上で、テーブルに正しいデータ型フィールドが追加されました。Happyrubyコーディング!!
これはすべて、列のデータ型に既存のデータの暗黙的な変換があることを前提としています。既存のデータString
が暗黙的に新しいデータ型に変換できるとしましょうDate
。
この状況では、データ変換を使用して移行を作成できることを知っていると役立ちます。個人的には、これらをモデルファイルに入れて、すべてのデータベーススキーマが移行されて安定したら削除するのが好きです。
/app/models/table.rb
...
def string_to_date
update(new_date_field: date_field.to_date)
end
def date_to_string
update(old_date_field: date_field.to_s)
end
...
def up
# Add column to store converted data
add_column :table_name, :new_date_field, :date
# Update the all resources
Table.all.each(&:string_to_date)
# Remove old column
remove_column :table_name, :date_field
# Rename new column
rename_column :table_name, :new_date_field, :date_field
end
# Reversed steps does allow for migration rollback
def down
add_column :table_name, :old_date_field, :string
Table.all.each(&:date_to_string)
remove_column :table_name, :date_field
rename_column :table_name, :old_date_field, :date_field
end