有效地从模型中批量删除条目

Bulk deleting entries from a model efficiently

假设我有一本模型书。我想删除在特定日期之前创建的所有条目和满足特定条件的书籍,没有 ISBN 的书籍。

批量获取 ID 和 运行 删除作业是否是最有效的方式? 注意:- 我知道删除比 destroy_all 快,但在这种情况下我不想跳过回调。

例子

Books.select(:id).where(isbn: nil).find_in_batches(batch_size: 1000) do |ids|
  Books.where(id: ids).destroy_all
end

destroy_all 等同于:

books.each(&:destroy)

正如您在 source code

中看到的

所以你可以:

Books.select(:id).where(isbn: nil).find_in_batches(batch_size: 1000) do |books|
  # since destroy_all is only a ActiveRecord::Relation method
  books.each(&:destroy)
end

这是最小的查询设置,可以最有效地执行此操作并触发您的回调。

注意:如果您的回调需要加载 id 以外的任何其他属性,您应该将其添加到您的 select 查询中。