gpt4 book ai didi

ruby-on-rails-3 - Rails 多态依赖 : :destroy not working correctly

转载 作者:行者123 更新时间:2023-12-03 20:52:33 26 4
gpt4 key购买 nike

假设我有三个 Active Record 模型:

class Tissue
has_many :boogers, as: :boogerable, dependent: :destroy
end

class Finger
has_many :boogers, as: :boogerable, dependent: :destroy
end

Class Boogers
belongs_to :boogerable, polymorphic: true
end

假设我的应用程序可以将鼻屎从手指转移到纸巾上,一旦完成,手指就会被破坏(哎呀!)。出于某种原因,当手指被破坏时,它也会破坏以前属于它并随后转移到组织上的鼻屎。在日志中我可以看到,当手指被破坏时,它会记住曾经属于它的鼻屎的 ID 并销毁它们。它不会检查以确保 boogerable_type 仍然是 'finger',从而破坏了类型为 'tissue' 的那些。

当手指被破坏时,它是这样做的:
DELETE FROM boogers WHERE booger.id = 387

什么时候应该这样做:
DELETE FROM boogers WHERE boogerable_id = 1 AND boogerable_type = 'finger'

有人遇到过这个吗?

最佳答案

首先,您需要知道 ActiveRecord destroy方法使用对象的 :id需要销毁它的字段。而dependent: :destroy选项将触发 destroy与当前对象关联的所有对象的方法。

我假设你正在做这样的事情:

f = Finger.find(finger_id)
t = Tissue.find(tissue_id)

f.boogers[0].boogerable = t
f.boogers[0].save!

f.destroy
dependent: :destroy声明意味着当 destroy被召唤 f ,它还会调用与 f 相关联的所有鼻屎。 .从 f并将其鼻屎加载到内存中, f.booger[0]对象仍然存在于 f.boogers 的数组中它将包含它的每个元素,包括 boogers[0] ,销毁时 f被摧毁。

这种情况的解决办法是你打 f.boogers.reload在调用 f.destroy 之前更新数组.

另外,请注意,当您销毁 f , 全部 关联 boogers将是 destroy ed,这真的是你想要的吗?销毁所有剩余关联的手指 boogers当其中一个被转移到其他东西时?

关于ruby-on-rails-3 - Rails 多态依赖 : :destroy not working correctly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24174071/

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