Techioz Blog

Ruby On Rails - 新しい移行とモデル変更により移行が失敗する

概要

新しいテーブルを追加するために新しい移行を作成しました。それを呼びましょう new_items 新しいテーブルを作成します。

移行では、別のテーブルとの関係を指定しました

t.belongs_to :parent

私のモデルでは、

class NewItem < ApplicationRecord
belongs_to :parent

class Parent < ApplicationRecord
has_many :new_items, :dependent => :destroy

したがって、すべての移行を最初から実行すると、古い移行で障害が発生します 「テーブル「new_items」が見つかりませんでした」 失敗した移行では、これは問題がどこにあるかを示す行です

def up
 Parent.where(name: "TestName").destroy_all
end

この次の行を削除すると完了まで実行されるため、親モデルに問題があります。

has_many :new_items, :dependent => :destroy

問題が親と NewItem の関係にあることはわかっていますが、最善の修正方法がわかりません

なぜそれが起こっているのかはわかりますが、テーブル間の関係を維持しながらそれを解決する方法がわかりません

解決策

移行で ActiveRecord モデルを使用する場合は、将来モデルに変更を加えても古い移行が中断されないように、これらのモデルを移行内で定義することが賢明です。

class Parent < ApplicationRecord; end

または、クラスが何もする必要がない場合は、より良い方法で

Parent = Class.new(ApplicationRecord)

移行クラス内に追加すると、問題が解決されるはずです。

補足: 単に親テーブルからすべてのレコードを削除したい場合は、移行時に Parent.delete_all を呼び出すことをお勧めします。これでも問題は解決しますが、移行にモデルを追加することをお勧めします。