Ruby on rails 为什么';t collection=上的对象有多个:通过删除关联时连接模型上的触发器回调?

Ruby on rails 为什么';t collection=上的对象有多个:通过删除关联时连接模型上的触发器回调?,ruby-on-rails,ruby-on-rails-4,activerecord,callback,has-many-through,Ruby On Rails,Ruby On Rails 4,Activerecord,Callback,Has Many Through,Rails 4文档中提到,对于的联接模型,销毁回调有很多:通过关系: 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_temp

Rails 4文档中提到,对于
的联接模型,销毁回调有很多:通过关系:

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
collection=objects
通过删除和 根据需要添加对象。如果:through选项为true 连接模型中的回调被触发,销毁回调除外, 因为删除是直接的

谢天谢地,至少有记录在案,但我想知道为什么会这样?希望有一个技术上的原因,否则就太疯狂了

在我的例子中,在连接表模型上,我有一个
has\u和\u belient\u to \u many
关系,它与另一个模型分离。删除第一个联接表上的关联记录时,将永远不会删除第二个联接表上的记录。我求助于这种感觉不太好的方法,我不得不在<代码>的每一边重复我自己:通过<代码>关系:

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

在两个外键之间的联接表记录上有一个“确保”唯一性的验证,因此我可以在回调中首先调用

通常,如果您想通过
删除某个内容,您将
dependent::destroy
放在那里:

class User
  has_many :partnerships, dependent: :destroy
  has_many :partners, through: :partnerships
end
如果要销毁
合作伙伴
以及合作伙伴关系,则必须将此依赖项添加到
合作伙伴
s模型:

class Partnership
  belongs_to :partner, dependent: :destroy
  belongs_to :user
end
当对象被销毁时,它对提供销毁依赖项的每个对象调用销毁。因此,
用户
在每个
合作伙伴
上调用destroy,每个
合作伙伴
在每个
合作伙伴
上调用destroy

“为什么它不能通过
一起使用”-答案是“因为删除是直接的”。我知道这说明不了什么(对我来说也是),但另一方面,对我来说,向没有直接链接的对象添加依赖项是个坏主意。
考虑上面的例子:如果依赖-破坏会对合作伙伴造成破坏,那么它是否也会破坏连接模型?当然是的,因为在另一种情况下,它会导致数据损坏,但您可能会丢失一些可能存在于联接模型中的数据,因此在某些情况下–不,您不想破坏联接模型。这意味着Rails团队必须添加新参数–
delete\u join
,以指示是否要保存该模型。
这只是一个糟糕的设计,因为我们已经有了更好的方法——在连接模型中添加依赖项。

所以前几天我遇到了同样的问题。 在我的例子中,我做了一些与您所做的类似的事情,并且遇到了相同的问题,连接表被删除而不是销毁

我开始浏览代码,我相信文档已经过时了。

您只需将dependent::destroy添加到has_many:through关系中

class User
  has_many :partnerships, dependent: :destroy
  has_many :partners, through: :partnerships, dependent: :destroy
end
我面对的痛苦是:

user.partner_ids = [1,2,3]
#creates the relationships
user.partner_ids = []
#was deleting the records from partnerships without callbacks.

合作伙伴关系的dependent::destroy修复了这一问题。回调现在正在运行,一切又好了。

谢谢你的回答:)我已经更新了这个问题,表明我已经在与联接模型的关联上设置了依赖销毁。不知道为什么我错过了那个:)我想我的论点是删除不应该是“直接的”,它应该触发连接模型上的
destroy
回调。太糟糕了,连接表上的dependent::destroy不能解决这个问题。。。这是一个错误的假设,即用户总是希望通过调用联接表上的回调来破坏关联。