产品(如 iPod Classic) :has_many => :listings, :dependent => :destroy
清单(例如“我的名字是乔,我有一个 iPod 出售):belongs_to => :product
所以,如果我删除一个给定的产品,所有指向它的列表都会被删除。这是有道理的,而且是设计使然。
但是,我正在编写一个“合并”函数,您可以将两个产品合并为一个,并合并它们的列表。所以,假设我的两个产品是“iPod Color”和“iPod Classic”,我想将两者合并。我想做的是说,“iPod Color,合并到 iPod Classic”,结果应该是:
- 所有 iPod 颜色列表都重新指向 iPod Classic 产品
- 在 product_id 更改后,Listing(s) 被保存
- 然后我删除“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