【问题标题】:When destroying one record, another one gets destroyed销毁一张记录时,另一张被销毁
【发布时间】:2011-01-08 19:54:12
【问题描述】:

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

列表(例如“我的名字是 Joe,我有一个 iPod 出售) :belongs_to => :产品

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

但是,我正在编写一个“合并”函数,您可以将两个产品合并为一个,并合并它们的列表。所以,假设我的两个产品是“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

【问题讨论】:

    标签: ruby-on-rails controller destroy


    【解决方案1】:

    我看到了同样的行为并重新加载解决了它。

    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
    

    【讨论】:

    • 很好的答案,你如何解释这种行为?
    • 当 merging_from 的列表添加到其他产品时,代码不会直接对它的列表关联做任何事情。原始产品仍显示相同的列表,因为关联已被缓存。如果在没有reload 的情况下调用destroy,则缓存列表会因为:dependent =&gt; :destroy 而被销毁。
    • 可能还有更多,但这是我目前的理解。
    • 有道理。重新加载或再次执行 Product.find(...) 会强制它重新加载。我想知道为什么调用destroy不会因为诸如此类的原因自动重新加载,或者是否有一个原因/案例你不希望它重新加载?假设在绝大多数情况下不需要重新加载,也许只是效率低下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多