在Rails中,如何删除数组中的所有对象?

In Rails, how do I delete all the objects in an array?

我正在使用 Rails 5,我想删除一个对象数组。在之前的帖子中,我读到 "destroy_all" 是真理和光明。我有两个对象数组,减去它们得到第三个数组

  unused_currencies = all_currencies - currencies_from_feed
  unused_currencies.destroy_all

但是在使用 destroy_all 时出现了这个错误:

NoMethodError: undefined method `destroy_all' for #<Array:0x007feea8878770>

Destroy_all 用于活动记录类型的东西。

你到底想做什么?如果你只是想摆脱数组,你可以用

覆盖它

unused_currencies = []

如果您试图销毁数组中的一堆活动记录对象,您将不得不遍历它并单独删除每个对象。

destroy_all 适用于 ActiveRecord::Relation

如果想清空数组,可以这样做:unused_currencies = []

如果要删除数组中的每一项: unused_currencies.each(&:destroy)。这将为每个项目生成一个删除查询。

一次删除所有对象(假设它们都属于同一个模型。如果不这样做,这将在您面前爆炸!)

unused_currencies.first.class.destroy_all(unused_currencies.map(&:id))

此代码将进行单个 SQL 查询:

unused_currencies = all_currencies - currencies_from_feed
CurrencyModel.delete(unused_currencies)

其中 CurrencyModel 是您的货币模型。

如果您需要 运行 模型回调,您可能需要使用 destroy

unused_currencies = all_currencies - currencies_from_feed
CurrencyModel.destroy(unused_currencies.map(&:id))

此代码将进行与未使用货币数量成比例的查询

如果您使用map,您会将所有数据加载到内存中。我想你可以这样做:

all_currencies.where.not(id: currencies_from_feed.select(:id)).destroy_all

如果all_currenciescurrencies_from_feedActiveRecord::Relation,这将生成只有一个请求sql.