答えて

8

change_columnデフォルトでは元に戻すことはできません。 Railsは移行の列定義を知ることができないため、元の定義にロールバックすることはできません。

このため、Rails 4から始めると、Railsにnescsessary情報を提供することができます。これは、その後updownを使用して、より複雑なようで、一見

def change 
    reversible do |dir| 
    dir.up do 
     change_column :users, :score, :decimal, precision: 6, scale: 2 
    end 
    dir.down do 
     change_column :users, :score, :decimal, precision: 4, scale: 2 
    end 
end 

: それはreversible方法が何のためにあるのかです。利点は、可逆的な移行と組み合わせることができることです。
つまり、あなたがテーブルにフィールドの束を追加し、に沿って視野を変更する必要があり、あなたはクリーンでコンパクトな移行を持っているreversibleと一緒change_tableadd_columnを使用することができます場合:

def change 
    change_table :users do |t| 
    t.string :address 
    t.date :birthday 
    # ... 
    end 

    reversible do |dir| 
    dir.up do 
     change_column :users, :score, :decimal, precision: 6, scale: 2 
    end 
    dir.down do 
     change_column :users, :score, :decimal, precision: 4, scale: 2 
    end 
end 
+0

Thanks、私はchange_columnとrailsでロールバックを試みましたこの移行ではchange_columnが使用されますが、これは自動的に元に戻すことはできません。 –

-1

以前の移行を元に戻すには、変更を使用しても問題ありません。

+0

そうでもない、私の場合change_column rails alertsでロールバックを試してください。この移行では、change_columnが使用されますが、これは自動的に元に戻すことはできません。 –

+0

はい、変更ステートメントで何が行われているかによって異なります。たとえば、列を追加すると、他のアクションと違って、レールが理解できるリバーシブルアクションウィッチがあります。 –

1

それが有するレール4本の又は レール5にchange_columnsと移動可能ロールバックです:はい、空(ならびに正しいないとマイグレーションをロールバックすることが可能である

def change end

-empty)changeメソッド。

実際に何かがある場合、削除した列のタイプを指定しなかった場合は、たとえばremove_columnなどの移行を元に戻せないことがあります。

changeの方法では、たとえば、change_columnがあるとします。 Railsは、どのタイプ/名前/どのカラムを変更前に持っていたのですか?downメソッドからではありません。 :)

したがって、できるだけ明示的にすることをお勧めしますので、updownを使用すると、非常に良い(実際には最高の)アイデアです。

+0

私は自分自身をよく表現していませんでした。私は質問を更新しました –

+0

@MatheusSilva、多分あなたはしませんでしたが、私はそう思いました:)アップ/ダウン+を使用することを推奨しました。 –

+0

ありがとうございます。 Railsの新しいバージョンは、変更が削除または名前変更のときに元に戻すことができますが、change_columnについては見つかりませんでした。 –

関連する問題