我不确定是否有人之前已经注意到这一点,因为我在这个问题上找不到任何主题。但假设您有一个产品型号和一个设置has_many :products
的购物车型号。并且产品模型设置belongs_to :cart
,当您将产品实例的cart_id
(这是引用相关购物车的ID的外键)设置为nil
时,会发生奇怪的事情。可能会发生三件事:
如果您在关联产品的cart_id
设置为nil
之前已经检索了关联的购物车,则在使用其实例方法destroy()
销毁该购物车实例时,相关产品也被摧毁。
如果您在关联产品的cart_id
设置为nil
后检索关联的购物车,则在使用其实例方法destroy
销毁相关产品时,相关产品 DOES不会被破坏。
如果您取消关联产品的cart_id
并在购物车(destroy
)上调用CLASS METHOD Cart.destroy(cart_id)
,则相关产品不会被销毁< /强>
我很确定这与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 :(得分:0)
我怀疑“奇怪的行为”的原因是,通过下载数据库对象也获得其依赖性。显然,即使数据库依赖项不存在,删除所有者的讨价还价也会删除从属元素(以及那些已经不存在的元素)。
因此,重新下载条目不会破坏关联。
Ale问题,którypokazałeśjestwarty odnotowania i sam pewniebymwpadłwjegopułapkę。