如何在Rails中从数据库中删除一个ID/对象数组?

7
我知道可以这样做:Model.destroy_all(status: "inactive")。但我的情况不是那么简单,因为我有一个加密字符串列,通过attr_encrypted gem映射到一个整数数组上,这使得操作变得繁琐。
基本上,我有一个像这样的数组:array = [object1, object2, object3, object4]其中每个对象都是模型对象。
我想要能够执行类似于Model.destroy_all(array)或者Model.delete_all(array)的操作,但我无法这样做。
我甚至尝试了以下操作:Model.destroy_all(array.map(&:id))Model.delete_all(array.map(&:id))但我不能成功删除它们。
我希望尽可能高效,并且认为array.map(&:destroy)array.map(&:delete)效率不高,因为我会得到N次调用。我应该这样做并将其包装在事务中吗?有更好的方法吗?
更新:我已经解决了问题,并在下面提供了答案。

你可以使用 Model.destroy_all(id: array.map(&:id))。我相信这比 Model.destroy(array) 更优化。 - Artem P
2个回答

12

嗯,这很傻。 原来我只需要执行以下操作:

Model.delete(array)Model.destroy(array),其中第一个不执行任何回调函数且速度明显更快,而另一个则实例化并执行所有回调函数。


4

如果你要调用destroy_all方法,那么最好自己循环遍历,因为这个方法本身也会这样做(以便处理任何回调)。

但如果你要删除它们,那么可以使用以下方法:

Model.where(id: array.map(&:id)).delete_all

同样,但使用destroy也可以实现:Model.where(id: array.map(&:id)).destroy_all - Rael Gugelmin Cunha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接