gpt4 book ai didi

ruby-on-rails - 为什么在 has_many :through trigger callbacks on the join model on deletion of the association? 上没有 collection=objects

转载 作者:行者123 更新时间:2023-12-04 20:36:43 24 4
gpt4 key购买 nike

Rails 4 文档说这是关于 has_many :through 的连接模型上的销毁回调。关系:

collection=objects Replaces the collections content by deleting and adding objects as appropriate. If the :through option is true callbacks in the join models are triggered except destroy callbacks, since deletion is direct.



值得庆幸的是,它至少被记录在案,但我想知道到底为什么会这样?希望有技术原因,否则就太疯狂了!

就我而言,我有一个 has_and_belongs_to_many连接表模型与另一个模型的关系。当第一个连接表上的相关记录被删除时,第二个连接表上的记录永远不会被删除。我求助于这个感觉很hacky,我不得不在 :through的每一边重复自己。关系:
has_many :schools_templates, dependent: :destroy
has_many :templates, through: :schools_templates, before_remove: :remove_groups_school_templates

private

def remove_groups_school_templates(template)
schools_templates.where(template: template).first.groups.clear
end

有一个验证来“确保”两个外键之间的连接表记录的唯一性,所以这就是我可以调用 first 的原因。在回调中。

最佳答案

通常,如果您想通过 has_many 删除某些内容你放的协会dependent: :destroy那里:

class User
has_many :partnerships, dependent: :destroy
has_many :partners, through: :partnerships
end

如果要销毁 partners以及合作伙伴关系,您必须将此依赖项添加到 Partnership型号:
class Partnership
belongs_to :partner, dependent: :destroy
belongs_to :user
end

当对象被销毁时,它会在每个提供销毁依赖项的对象上调用销毁。所以 User在每个 Partnership 上调用 destroy ,以及每个 Partnership在每个 Partner 上调用 destroy .

“为什么它不能与 through 一起使用” - 答案是“因为删除是直接的”。我知道它并没有说太多(对我来说也是如此),但另一方面,对我而言,向未直接链接的对象添加依赖项是一个坏主意。
考虑上面的例子:如果依赖 - destroy 将对合作伙伴起作用并销毁它们 - 它也应该销毁连接模型吗?当然是的,因为在其他情况下它会导致数据损坏,但是您可能会丢失一些可能位于连接模型中的数据,因此在某些情况下 - 不,您不想破坏连接模型。这意味着 Rails 团队必须添加新参数 – delete_join指示是否要保存该模型。
这只是一个糟糕的设计,因为我们已经有了更好的方法——在连接模型中添加依赖项。

关于ruby-on-rails - 为什么在 has_many :through trigger callbacks on the join model on deletion of the association? 上没有 collection=objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33907921/

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