我不確定以前是否有人注意到這一點,因爲我在這個問題上找不到任何話題。但假設您有產品型號和購物車型號has_many :products
。並且產品型號設置爲belongs_to :cart
,當您將產品實例的cart_id
(這是引用相關購物車ID的外鍵)設置爲nil
時,會發生奇怪的事情。三件事情可能發生:Rails has_many關係很奇怪
如果你已經獲取的相關車前設置了相關產品的
cart_id
到nil
,當你使用它的實例方法destroy()
,相關產品被破壞以及摧毀車實例。如果您檢索相關的車後設置相關產品的
cart_id
到nil
,當你使用它的實例方法destroy
,相關產品沒有得到破壞摧毀它。如果你廢了相關產品的
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
這就是我在帖子中所說的。我希望能夠更多地瞭解幕後的情況,但我不認爲自己已經足夠閱讀源代碼了。 – 2012-04-28 19:21:04
對不起,我有點嗡嗡聲。週六,你知道;) – Eraden 2012-04-28 19:37:40
這可能是由於類似於控制緩存:不知何故,當你檢索購物車時,相關產品對象被檢索和緩存(或以某種方式「記錄」),並在下一次通過調用Cart#產品,只需從緩存中檢索它們 – 2012-04-30 03:36:20