2011-09-22 35 views
28

我从Rails查找查询中得到结果集。我想迭代该结果集并根据结果集中的某些条件删除记录,然后将其传递给进一步处理。额外的标准是在数据库中保存的数据的外部,因此我不能将它们包括在原始的“查找”查询中。如何从Activerecord查询结果集中删除项目?

注意我不想从数据库中删除任何记录,只是将它们从结果集中删除。

请有人给我的代码来做到这一点。

+0

你有没有找到你要找的东西? – Magnum

+0

这可以关闭为“太宽泛”或“建议使用非现场资源”。 – halfer

回答

6
set = MyObject.find(...) 
set = set.reject{|s| ... } 

set = set.select{|s| ... } 
+2

当我这样做'集'似乎被转换成'数组'? – Deekor

+0

'find'只返回一个对象。也许你想'MyObject.all'或'MyObject.where' –

+0

@DylanVanderBerg你知道这个问题是关于RoR v1还是v2? :) – fl00r

30

使用reject

Model.find_all_by_xxx().reject { |r| r.something? } 
+5

这将不起作用,因为'find_by_xxx'返回单个记录。你想要'find_all_by_xxx'。 –

+1

@RyanBigg哎呀,你是对的。我在回答时正在研究一个Doctrine项目,其中'find_by_xxx'返回一个集合。编辑。 – Fabio

1

您可以使用delete_at太:

irb(main):005:0> c = Category.all 
Category Load (0.3ms) SELECT "categories".* FROM "categories" 
=> [#<Category id: 1, name: "15 anos", description: nil, created_at: "2011-09-22 04:52:53", updated_at: "2011-09-22 04:52:53">] 
irb(main):006:0> c.delete_at(0) 
=> #<Category id: 1, name: "15 anos", description: nil, created_at: "2011-09-22 04:52:53", updated_at: "2011-09-22 04:52:53"> 
irb(main):007:0> c 
=> [] 
+4

这将从数据库中删除条目,对吧? – JustBasti

0

如果一些处理必须在应用程序代码,SQL完成能够 不这样做,并且结果必须是已更改的查询对象,通过id重新查询对象可能是一个(非常非常低效的内存)选项。

needed_ids = Model.where(<some original query>).map{|r| r.something? ? r.id : nil }.compact 
new_collection = Model.where(id: needed_ids)