【问题标题】:Making Rails #destroy_all run faster让 Rails #destroy_all 运行得更快
【发布时间】:2011-08-03 17:05:36
【问题描述】:

我想运行Alarm.destroy_all,但是,每个警报都关联到许多AlarmEvents,每个AlarmEvent 关联到许多AlarmEvent::Measurements,这两个关联都标记为:dependent=>destroy

所以,当我调用 Alarm.destroy all 时,这个调用需要很长时间才能运行。有什么办法可以让它更快吗?怎么样?

到目前为止,我已经尝试过Alarm.joins(:alarm_events).destroy_all,但它仍然很慢。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord arel


    【解决方案1】:

    destroy_all 的更快替代方案是delete_all,但这不会追踪并破坏任何依赖项,也不会触发任何before_destroyafter_destroy 挂钩。

    如果您真的关心速度,您可能会考虑到这一点重新编写此内容。您甚至可以将其作为一系列条件进行分类:

    Alarm.delete_all(:id => alarm_ids)
    AlarmEvent.delete_all(:alarm_id => alarm_ids)
    

    【讨论】:

      【解决方案2】:

      我通过将调用替换为:

      Alarm.transaction{
        AlarmEvent::Measurement.destroy_all
        AlarmEvent.destroy_all
        Alarm.destroy_all
      }
      

      这仍然保证与销毁相关的过程会运行,但它会预先执行其中的很大一部分,从而避免大量“嵌套查询”。

      【讨论】:

      • 此解决方案仅适用于您希望在调用Alarm.destroy_all 时销毁所有现有AlarmEvent 的情况。可能是您想要的,但只是一个警告。
      • 是的。此解决方案适用于我的模型。但是,如果测量值和警报事件在没有分别连接到任何警报事件或警报的情况下就存在,那就不好了。
      猜你喜欢
      • 1970-01-01
      • 2011-05-10
      • 2011-04-30
      • 2018-02-11
      • 1970-01-01
      • 2010-11-06
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多