我正在使用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>
答案 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_currencies
和currencies_from_feed
ActiveRecord :: Relation ,则会生成只有一个请求sql 。