如何从Activerecord查询结果集中删除项目?

31
从Rails查询结果集。我想遍历该结果集,并根据某些条件在进一步处理之前从该结果集中删除记录。附加的条件是不属于数据库中保存的数据,因此我不能将它们包含在原始的“find”查询中。
请注意,我不想从数据库中删除任何记录,只是将它们从结果集中移除。
请有人给我提供执行此操作的代码。

你找到你想要的东西了吗? - Grey
这个问题可以被归类为“过于宽泛”或“推荐离线资源”。 - halfer
4个回答

32

使用reject函数,如下:

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

5
这样做行不通,因为 find_by_xxx 只返回一条记录。你应该使用 find_all_by_xxx - Ryan Bigg
1
@RyanBigg 哎呀,你说得对。我当时正在处理一个Doctrine项目,find_by_xxx返回的是一个集合。已经修改了。 - Fabio

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

或者

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

3
当我进行这个操作时,set 似乎被转换成了一个 array - Deekor
find only returns one object. Perhaps you want MyObject.all or MyObject.where - Dylan Vander Berg
@DylanVanderBerg 你意识到这个问题是关于 RoR v1 还是 v2 吗? :) - fl00r

2

如果应用程序代码中必须进行某些 SQL 无法完成的处理,并且结果必须是更改后的查询对象,则通过id重新查询对象可能是一种(非常内存低效的)选项。

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

-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
=> []

5
这个会从数据库中删除这个条目,对吗? - Sebastian
他要求从活动记录对象中删除,而不是从数据库中删除!这个要小心! - jeffci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接