1

产品(如 iPod Classic) :has_many => :listings, :dependent => :destroy

清单(例如“我的名字是乔,我有一个 iPod 出售):belongs_to => :product

所以,如果我删除一个给定的产品,所有指向它的列表都会被删除。这是有道理的,而且是设计使然。

但是,我正在编写一个“合并”函数,您可以将两个产品合并为一个,并合并它们的列表。所以,假设我的两个产品是“iPod Color”和“iPod Classic”,我想将两者合并。我想做的是说,“iPod Color,合并到 iPod Classic”,结果应该是:

  1. 所有 iPod 颜色列表都重新指向 iPod Classic 产品
  2. 在 product_id 更改后,Listing(s) 被保存
  3. 然后我删除“iPod Color”产品

好吧,这应该一切正常,无需删除任何列表。但是,我有这个控制器,无论出于何种原因,当我销毁“iPod Color”产品时,即使在确认列表已移动到“iPod Classic”并保存到数据库之后,之前指向的列表“iPod Color”也被破坏了,我不知道为什么。就好像他们保留了与被破坏产品的某种联系,因此开始自行破坏。

我错过了什么令人痛苦的显而易见的事情?

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 回答