Rails has_many关系很奇怪

时间:2012-04-28 18:54:16

标签: ruby-on-rails ruby-on-rails-3

我不确定是否有人之前已经注意到这一点,因为我在这个问题上找不到任何主题。但假设您有一个产品型号和一个设置has_many :products的购物车型号。并且产品模型设置belongs_to :cart,当您将产品实例的cart_id(这是引用相关购物车的ID的外键)设置为nil时,会发生奇怪的事情。可能会发生三件事:

  1. 如果您在关联产品的cart_id设置为nil之前已经检索了关联的购物车,则在使用其实例方法destroy()销毁该购物车实例时,相关产品也被摧毁

  2. 如果您在关联产品的cart_id设置为nil后检索关联的购物车,则在使用其实例方法destroy销毁相关产品时,相关产品 DOES不会被破坏

  3. 如果您取消关联产品的cart_id并在购物车(destroy)上调用CLASS METHOD Cart.destroy(cart_id),则相关产品不会被销毁< /强>

  4. 我很确定这与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
    

1 个答案:

答案 0 :(得分:0)

我怀疑“奇怪的行为”的原因是,通过下载数据库对象也获得其依赖性。显然,即使数据库依赖项不存在,删除所有者的讨价还价也会删除从属元素(以及那些已经不存在的元素)。

因此,重新下载条目不会破坏关联。

Ale问题,którypokazałeśjestwarty odnotowania i sam pewniebymwpadłwjegopułapkę。