【问题标题】:Rails: `model.each { |x| x.destroy }` in `around_destroy` not working the same as elswhere导轨:`model.each { |x| `around_destroy` 中的 x.destroy }` 与 elswhere 的工作方式不同
【发布时间】:2016-11-25 03:03:31
【问题描述】:

ModelAModelB 之间存在多对多关系,如果关联的 ModelA 被销毁,我希望所有 ModelB 都被销毁。

所以我的model_a.rb 有一个像这样的around_destroy

around_destroy :destroy_model_bs

def destroy_model_bs
  m_bs = self.model_bs
  yield
  m_bs.each {|m_b| m_b.destroy }
end

但这只会破坏关联。

但是,在控制台中,如果我做同样的事情:

m_a  = ModelA.find(104) # 104 being the ID
m_bs = m_a.model_bs
m_bs.each {|m_b| m_b.destroy }

这实际上销毁了与 ID 为 104 的 ModelA 关联的所有 ModelB。

为什么会这样?并且,如果可能,请告诉我一个更好的销毁所有方法(dependent: :destroy 不适用于多对多)。

【问题讨论】:

    标签: ruby-on-rails many-to-many destroy


    【解决方案1】:

    你们的关系是habtm吗?使用has_many through 创建连接表可能会更好。然后你可以使用dependent: :destroy

    【讨论】:

    • 这是直接的多对多关系,而不是间接的has_many through: :model_b 关系。但即使我将其更改为has_many through:,我仍然很想知道为什么会这样。目前,我只是在before_destroy 中完成了它,它工作正常。
    • 我不确定为什么around_destroy 不起作用。您是否尝试过将其作为before_destroy 回调?
    • 我做到了。我之前的评论:“目前,我只是在before_destroy 中完成了它,并且效果很好。”如果我找到解决方案,我会尝试解决它并在此处发布解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多