マイグレーション・ロールバック:「チェンジ」メソッドの落とし穴を学ぶ


私は最近FlatironのソフトウェアエンジニアリングBootcampの第3段階のプロジェクトを終えました.私はフロントエンドのための反応を使用して育てられたベッドの庭の計画のアプリを構築し、私のバックエンドのActiveRecordとラックとルビー.それは私の最初の実際のバックエンドの経験だった.あなたが展開アプリをチェックアウトすることができますhere .

私は、このプロジェクトの私自身の間違いから多くを学ばなければなりませんでした、そして、特に1つの間違いはこのブログポストがActiveRecord移動について学ぶ他の人に対する注意の語として役立つことができることを願っています.
これは、すべてのActiveRecordの移行がサポートしていないことですchange 方法(あるいは全く)これはActive Record Migration docs , 明らかに災難の前に私の目を逃がしたセクションは、打ちました.

誤り


これを「間違い」と呼ぶことは、少し誤解を招くことです.それは本当にActiveRecordの移行とRAKEコマンドの理解の私自身の不足に起因する間違いの連鎖だった.
この間違いの連鎖は、私の植物モデルの37レコードと、私のノートモデルの3倍で始まりました.
私は、キュートであると思いました、私自身に若干の余分の『反応で制御された形』を与えて、フォームをPOST 私のバックエンドにこのデータ.私が1つのコマンドで後で破壊した労働を浪費する時間.
私の次のミスステップは、私が私のモデルで不適切な関連を持っていると理解したときでした.修正するには、外国人IDを削除するためのマイグレーションを書きました.
class RemoveGardenIdColumnFromPlants < ActiveRecord::Migration[6.1]
  def change
    remove_column :plants, :garden_id
  end
end
これを移行した後、私は新しいモデルとさらに別の移行を作成しました.私は私のスキーマをチェックして、私の協会からremove_column マイグレーションはまだプラントテーブルにありました、これは関連IDを削除する正しい方法ではなかったからです.
「問題はない」と私は思った.
「ああ、そんなに速くない!」とActiveRecord :
===========================================================
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

remove_column is only reversible if given a type.
ここでは物事は非常に私のために南行く.

It's important to note that up until this point, it was absolutely possible for me to reverse this migration and not lose my data in the process.
Taking a break before the panic starts might be the most important lesson here.


私は、私の欲求不満が育ったので、無謀さを増しているものをしようとして、googlingを始めました.ここで私は、私が直面していた問題を解決する方法を尋ねていたと考えているスタックオーバーフローの質問を誤解し、実行の致命的なミスを犯したrake db:drop . これは私が移行ミスを削除することができましたが、私はまた、私は私が作ったその形式を介して提出時間を費やしていたすべてのデータを失った.
🙃 恐ろしい.

間違いを避ける


まず最初に、何かが間違っているとき、特にデータと共に働くとき、止まります.休憩しなさい.散歩に行きなさい.データベースコマンドのミスは、貴重な時間がかかる恐ろしい結果を持つことができます.そして、あなたはそれを走らせる勇気がありません@ $!ingコマンドを知っているまで.
したら、問題から離れて、それに戻って来て、アドバイスを読んで慎重に.
このポストを書く際に、私は、私が遭遇した最初の答えを読みましたup and down メソッドremove_column 移行私はこれを試したが、同じエラーを受けた.
その答えの次の行は、指定したバージョンにロールバックする方法を説明しますrake db:down VERSION=<your-version-number-here> . 私は私のマイグレーションの最初のバージョンにロールバックしようとしました.そして、それは働きませんでした、この線が実際に私に言っていたものがそれであったので、私はremove_column , 私はロールバックする必要がありますremove_column で移動し、up\down 実装.

解決策

  • 不可逆的な移動後に別のマイグレーションを作成した場合、rake db:down VERSION=<your-version-number-here>
  • 使用する不可逆移行ファイルを変更するup and down 変更の代わりに、
  • class RemoveGardenIdColumnFromPlants < ActiveRecord::Migration[6.1]
        def up
            remove_column :plants, :garden_id 
        end
        def down
            add_column :plants, :garden_id, :integer
        end
    end
    
    または使用change :
    class RemoveGardenIdColumnFromPlants < ActiveRecord::Migration[6.1]
      def change
        remove_column :plants, :garden_id, :integer
      end
    end
    
    ActiveRecordは素晴らしいツールですが、移行は急カーブを学ぶことができます.あなたの時間を取る、息をし、ドロップテーブルの上に泣かないでください.