在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_currencies
和currencies_from_feed
是ActiveRecord::Relation,这将生成只有一个请求sql.
我正在使用 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_currencies
和currencies_from_feed
是ActiveRecord::Relation,这将生成只有一个请求sql.