Ruby on rails 在Rails中高效删除所有依赖项

Ruby on rails 在Rails中高效删除所有依赖项,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我正在尝试对一个ActiveRecord关系执行delete\u all,该关系有很多行和一个级别依赖项 当我使用destroy\u all时,它当然非常慢,因为它迭代了整个关系 当使用delete\u all时,我无法找到一种方法来指定rails也应该删除(而不是销毁)它的依赖项 这就是我所知道和尝试的: 我有一个成员模型和一个消息模型 在成员模型中,我有 有很多:消息、与::成员相反的、依赖的::销毁 我认为将上述内容更改为dependent::delete_all将使用一个查询删除所有依赖

我正在尝试对一个ActiveRecord关系执行
delete\u all
,该关系有很多行和一个级别依赖项

当我使用
destroy\u all
时,它当然非常慢,因为它迭代了整个关系

当使用
delete\u all
时,我无法找到一种方法来指定rails也应该删除(而不是销毁)它的依赖项

这就是我所知道和尝试的:

  • 我有一个
    成员
    模型和一个
    消息
    模型
  • 在成员模型中,我有
    有很多:消息、与::成员相反的、依赖的::销毁
  • 我认为将上述内容更改为
    dependent::delete_all
    将使用一个查询删除所有依赖项(删除[array of members to delete]中的成员ID所在的消息)-它没有这样做,而是由于外键错误而失败
  • 我已经在适当的Rails文档页面(如)和一些相关的StackOverflow问题(如)上花了时间
  • 到目前为止,我找到的解决方案是:

    # Define the Member collection we want to delete
    members = Member.where comment: 'debug'
    
    # Get all the IDs from it
    ids = members.pluck :id
    
    # Delete all the dependent Message objects first
    Message.where(member_id: ids).delete_all
    
    # Then delete the Members
    members.delete_all
    
    这是快速的,并正确地导致两个删除查询

    我的问题是:

    • 难道
      dependent::delete_all
      定义不应该为我这样做吗
    • 有没有更像Rails的方法?感觉就像我在手动做一些rails本身应该处理的事情

    我以前也这样做过,在这里我重写了我的
    destroy
    方法。当时,我做了广泛的研究,做了你所做的事情。如果您最终覆盖了
    destroy
    ,请确保在事务中包装您的方法。如果您的某个依赖项出现错误,这将通过回滚删除来保护您

    顺便说一句,你可以链接你的位置,从数据库中拨出并保存一个电话


    member\u id=member.where(comment:'debug').pull(:id)

    您始终可以在模型中编写方法并删除依赖项。通过绑定该方法以删除事件,可以自动调用该方法。因此,无论何时在父级上触发delete,都会自动调用该方法并首先删除子级。确保在删除主父项之前先删除从属项。
    在销毁之前
    用于销毁的回调。。。。但仍然需要2个SQL查询。。。我想没有别的解决办法了。谢谢。我没有覆盖
    销毁
    ——对我来说似乎很危险。我希望我错过了一些东西,rails有一个内置的方法来有效地做到这一点。