1

製品(iPod Classicなど):has_many =>:listings、:dependent =>:destroy

リスト(「私の名前はジョーです。iPodを販売しています):belongs_to =>:product

したがって、特定の製品を削除すると、その製品を指すすべてのリストが削除されます。それは理にかなっており、仕様によるものです。

ただし、私は「マージ」関数を作成しています。この関数では、2つの製品を1つにマージし、それらのリストを結合します。それで、私の2つの製品が「iPodColor」と「iPodClassic」であるとしましょう。2つをマージしたいと思います。私がやりたいのは、「iPod Color、iPod Classicにマージ」と言うことです。結果は、次のようになります。

  1. すべてのiPodカラーリストはiPodClassic製品に再指定されています
  2. product_idの変更後、リストが保存されます
  3. その後、「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
4

1 に答える 1

4

私は同じ振る舞いを見て、リロードがそれを解決しました。

def merge
  merging_from = Product.find(params[:id])
  merging_to = Product.find_by_model(params[:merging_to])

  if merging_from && merging_to && merging_from != merging_to
    merging_to.listings << merging_from.listings
    merging_from.reload.destroy
  end
end
于 2011-01-08T20:48:41.167 に答える