【问题标题】:before_destroy not firing with has_many :throughbefore_destroy 不使用 has_many 触发:通过
【发布时间】:2017-03-02 08:44:15
【问题描述】:

我想删除与被销毁组关联的所有 group_maps 记录。 In the docs,上面写着

如果使用 :through 选项,则连接记录将被销毁,而不是对象本身。

我很困惑。

group.rb

class Group < ApplicationRecord

  belongs_to :user

  has_many :group_maps
  has_many :users, :through => :group_maps

  before_destroy :destroy_group_maps

  def destroy_group_maps
    self.group_maps.delete_all
  end

end

编辑 1:
顺便说一句,我试过添加,:dependent =&gt; destroy:dependent =&gt; delete_all 也是。他们都没有工作。

编辑 2:
group_maps_controller.rb

class GroupMapsController < ApplicationController

  def destroy
    GroupMap.find[params[:id]].destroy
  end
end

【问题讨论】:

  • 试试,self.group_maps.destroy_all
  • 感谢您的评论,它也不好用。问题是我在 groups_controller.rb 中没有 destroy 方法吗?如果是这样,我应该在destroy 方法中添加什么?
  • 没有破坏方法不是问题,你有没有像 thoi 一样添加依赖破坏? has_many :group_maps, dependent: :destroy
  • 如果你在控制台中尝试,重启 Rails 控制台
  • 哦,谢谢!这就是问题所在。重新启动控制台就像一个魅力。另外,我可以使用has_many :group_maps, :dependent =&gt; :destroy,它也可以!您能否将您的答案转换为评论,以便我将其标记为答案?

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord


【解决方案1】:

您可以添加 dependent: :destroy 来删除它们,而不是调用 before_destroy 来销毁关联。

dependent: :destroy 删除关联的记录,一旦父记录被删除。

我更喜欢使用dependent: :destroy 而不是before_destroy

class Group < ApplicationRecord

  belongs_to :user

  has_many :group_maps, dependent: :destroy
  has_many :users, :through => :group_maps

  before_destroy :destroy_group_maps

  def destroy_group_maps
    self.group_maps.delete_all
  end

end

【讨论】:

  • @Nerzid,作为答案添加。很高兴能帮助你。 :)
  • 谢谢,但问题是关于重启rails控制台^_^。
  • 可以,但最好使用dependent: :destroy
【解决方案2】:

在您的 destroy_group_maps 方法中,输入:

def destroy_group_maps
  self.group_maps.each { |group_map| group_map.destroy }
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多