製品(iPod Classicなど):has_many =>:listings、:dependent =>:destroy
リスト(「私の名前はジョーです。iPodを販売しています):belongs_to =>:product
したがって、特定の製品を削除すると、その製品を指すすべてのリストが削除されます。それは理にかなっており、仕様によるものです。
ただし、私は「マージ」関数を作成しています。この関数では、2つの製品を1つにマージし、それらのリストを結合します。それで、私の2つの製品が「iPodColor」と「iPodClassic」であるとしましょう。2つをマージしたいと思います。私がやりたいのは、「iPod Color、iPod Classicにマージ」と言うことです。結果は、次のようになります。
- すべてのiPodカラーリストはiPodClassic製品に再指定されています
- product_idの変更後、リストが保存されます
- その後、「iPodColor」製品を削除します
リストを削除しなくても、すべて正常に機能するはずです。しかし、私はこのコントローラーを持っています。何らかの理由で「iPod Color」製品を破棄すると、リストが「iPod Classic」に移動されてデータベースに保存されたことを確認した後でも、以前にポイントされたリストが表示されます。 「iPodColor」も破壊されてしまい、その理由がわかりません。それはまるで彼らが破壊された製品へのある種のリンクを保持しているようであり、したがって彼ら自身が破壊され始めます。
私が見逃している痛々しいほど明白なことは何ですか?
def merge
merging_from = Product.find(params[:id])
merging_to = Product.find_by_model(params[:merging_to])
unless merging_to.nil?
unless merging_from.nil?
unless merging_from == merging_to # you don't want to merge something with itself
merging_from.listings.each do |l|
l.product = merging_to
l.save
end
# through some debugging, I've confirmed that my missing Listings are disappearing as a result of the following destroy call
merging_from.destroy
end
end
end