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

时间:2011-09-22 12:20:19

标签: ruby-on-rails activerecord

我从Rails查找查询中获取结果集。我想迭代该结果集并依赖于某些条件从该结果集中删除记录,然后再将其传递以进行进一步处理。附加条件在数据库中保存的数据外部,因此我不能将它们包含在原始的“查找”查询中。

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

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

4 个答案:

答案 0 :(得分:30)

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

答案 1 :(得分:6)

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

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

答案 2 :(得分: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
=> []

答案 3 :(得分:1)

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

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