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

时间:2017-08-09 19:16:22

标签: ruby-on-rails arrays ruby ruby-on-rails-5 destroy

我正在使用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>

4 个答案:

答案 0 :(得分:3)

此代码将生成单个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))

此代码会使许多查询与未使用的货币数量成比例

答案 1 :(得分:0)

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

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

覆盖它

unused_currencies = []

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

答案 2 :(得分:0)

ActiveRecord::Relation适用于unused_currencies = []

如果要清除阵列,可以执行:unused_currencies.each(&:destroy)

如果要删除数组中的每个项目: unused_currencies.first.class.destroy_all(unused_currencies.map(&:id)) 。这将为每个项目生成删除查询。

一次删除所有物品(假设它们都属于同一型号。如果不这样,它们会在你的脸上爆炸!)

{{1}}

答案 3 :(得分:0)

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

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

如果all_currenciescurrencies_from_feed ActiveRecord :: Relation ,则会生成只有一个请求sql