ROR移行中に列タイプを日付から日付時刻に変更する


227

作成しているアプリの列タイプを日付から日時に変更する必要があります。データはまだ開発中なので、気にしません。

これどうやってするの?

回答:


508

最初にあなたのターミナルで:

rails g migration change_date_format_in_my_table

次に、移行ファイルで:

Rails> = 3.2の場合:

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
    change_column :my_table, :my_column, :datetime
  end

  def down
    change_column :my_table, :my_column, :date
  end
end

27
あなたが正しい、私は初心者が利用可能な最新のテクノロジーを選ぶと仮定しただけですが、それはもちろん、不確かです
無呼吸

12
質問には「ruby-on-rails-3」というタグが付けられています
Sucrenoir

2
@Sucrenoirええタグは彼が答えた後に無呼吸によって追加されました。
Jason

10
and メソッドのchange代わりに単一のメソッドが使用されない理由が不思議に思う場合、それメソッドが移行定義をサポートしていないためです。updownchangechange_column
デニス

2
この答えは部分的に正しいだけです。レール4でもchange内でchange_columnを使用することはできません。そうでない場合、ダウンマイグレーションは機能しません。Railsのバージョンに関係なく、up / downを使用する必要があります。
アランピーボディ14

78

また、Rails 3以降を使用している場合は、upおよびdownメソッドを使用する必要はありません。あなたはただ使うことができますchange

class ChangeFormatInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :my_new_type
  end
end

78
変更方法は、可逆的な移行でのみ機能します。上記のコードは、ActiveRecord :: IrreversibleMigration例外をスローします。changeメソッドでは、api.rubyonrails.org / classes / ActiveRecord / Migration /…のメソッドのみを使用する必要があります。
davekaro 2013年

3
私はRails 4を実行していて、以前にこの種の移行を行いました。変更は機能しません!@davekaroのコメントは正しいです。
ハリート2014年

3
Rails 5の場合、これは正しい動作するソリューションです。
WM

3
逆転すると、どの列タイプに変更する必要があるかをどのようにして知ることができますか?
Andrew Grimm

@AndrewGrimm正解です。これは私が私の移行を逆転しようとすると、私が見たものである:This migration uses change_column, which is not automatically reversible. To make the migration reversible you can either: 1. Define #up and #down methods in place of the #change method. 2. Use the #reversible method to define reversible behavior.
Marklar

42

Rails 3.2とRails 4では、Benjaminの人気ある回答の構文は少し異なります。

最初にあなたのターミナルで:

$ rails g migration change_date_format_in_my_table

次に、移行ファイルで:

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
   change_column :my_table, :my_column, :datetime
  end

  def down
   change_column :my_table, :my_column, :date
  end
end


1

私の知る限り、移行では、スキーマを変更するときに、気になるデータ(つまり本番)を再形成しようとします。それでそれが間違っていない限り、そして彼はデータを気にしないと言ったので、元の移行の列タイプを日付から日付時刻に変更して、移行を再実行してみませんか?(テストがあることを願っています:))。


2
チームで作業していて、スキーマの変更をチーム内の他のすべての開発者に反映させたい場合は、データに関心がなくても、開発環境での移行の使用に関心を持つ可能性があります。
ホセB

この状況で、列を変更するための追加の移行がどのような利点をもたらすかを確認できません。列を作成した元の移行を変更することの何が問題になっていますか?どちらの場合も、新しいスキーマを取得するには、各チームメンバーがすべての移行を再実行する必要があります。
2014年

新しい移行を使用する場合は、列タイプを変更した移行を元に戻すことができます。オリジナルを編集する場合、その編集をロールバックし、その後マイグレーションを再実行する必要があります。
jazzpi

実際の運用データがないため、これは実際には非常に賢明な回答です。他のチームメンバーを心配する人にとってrake db:migrate:resetは、それが目的です。
Ryan McGeary 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.