gpt4 book ai didi

ruby-on-rails - Rails has_many 关系很奇怪

转载 作者:行者123 更新时间:2023-12-01 08:03:56 25 4
gpt4 key购买 nike

我不确定之前是否有人注意到这一点,因为我找不到关于此问题的任何主题。但假设您有一个 Product 模型和一个设置 has_many :products 的 Cart 模型。并且 Product 模型设置 belongs_to :cart,当您设置产品实例的 cart_id(这是指关联购物车 ID 的外键)时会发生奇怪的事情为 nil。可能会发生三种情况:

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

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

  3. 如果您取消关联产品的 cart_id 并在购物车上调用类方法 destroy (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

最佳答案

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

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

Ale problem, który pokazałeś jest warty odnotowania i sam pewnie bym wpadł w jego pułapkę。

关于ruby-on-rails - Rails has_many 关系很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10366551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com