2012-04-28 136 views
3

我不確定以前是否有人注意到這一點,因爲我在這個問題上找不到任何話題。但假設您有產品型號和購物車型號has_many :products。並且產品型號設置爲belongs_to :cart,當您將產品實例的cart_id(這是引用相關購物車ID的外鍵)設置爲nil時,會發生奇怪的事情。三件事情可能發生:Rails has_many關係很奇怪

  1. 如果你已經獲取的相關車前設置了相關產品的cart_idnil,當你使用它的實例方法destroy(),相關產品被破壞以及摧毀車實例。

  2. 如果您檢索相關的車後設置相關產品的cart_idnil,當你使用它的實例方法destroy,相關產品沒有得到破壞摧毀它。

  3. 如果你廢了相關產品的cart_id,並呼籲車(Cart.destroy(cart_id))類方法destroy,相關產品沒有得到破壞

我敢肯定,這有某事與has_many執行。當您檢索關係時,關係狀態可能會硬連接到模型實例。 見下面的代碼:

下面是我用於測試上述樣本代碼(假設你已經在2上述模型表)

Cart.create # Assume this one has an id of 1 
Product.create(cart_id: 1) 
cart=Cart.find(1) # Retrieve the cart before 
Product.find(1).update_attribute!(cart_id: nil) 
cart.destroy 
Product.find_by_id(1) # nil; the associated product was destroyed 

Cart.create # Assume this one has an id of 1 
Product.create(cart_id: 1) 
Product.find(1).update_attribute!(cart_id: nil) 
cart=Cart.find(1) # Retrieve the cart AFTER 
cart.destroy 
Product.find_by_id(1) # [<Product id:1 cart_id:1 ....>], the assoc product WAS NOT destroyed 

Cart.create # Assume this one has an id of 1 
Product.create(cart_id: 1) 
Product.find(1).update_attribute!(cart_id: nil) 
Cart.destroy(1) 
Product.find_by_id(1) # [<Product id:1 cart_id:1 ....>], the assoc product WAS NOT destroyed 

回答

0

我懷疑「奇怪的行爲」的原因是,通過下載數據庫對象也得到它的依賴。顯然,即使數據庫依賴關係不存在,刪除所有者的討價還價刪除了從屬元素(以及那些已經不存在的元素)。

因此,重新下載條目不會破壞關聯。

麥芽酒問題,którypokazałeśjest warty odnotowania i sam pewnie bymwpadłw jegopułapkę。

+0

這就是我在帖子中所說的。我希望能夠更多地瞭解幕後的情況,但我不認爲自己已經足夠閱讀源代碼了。 – 2012-04-28 19:21:04

+0

對不起,我有點嗡嗡聲。週六,你知道;) – Eraden 2012-04-28 19:37:40

+0

這可能是由於類似於控制緩存:不知何故,當你檢索購物車時,相關產品對象被檢索和緩存(或以某種方式「記錄」),並在下一次通過調用Cart#產品,只需從緩存中檢索它們 – 2012-04-30 03:36:20