可以使用内置方法进一步过滤活动记录返回的集合吗?

时间:2011-03-07 03:36:39

标签: ruby-on-rails

我有一个这样的集合:

UserLevels
   id
   blah_id
   blah2_id
   ..
   ..

现在我想进一步使用

的所有行提交此集合

blah2_id = 3

我不需要再次访问数据库,因为我已经有了这个集合,而且这个集合最多可能有5-10行。

最好的方法是什么?或者我有什么选择。

2 个答案:

答案 0 :(得分:2)

首先想到的是Array#select(仅限Ruby 1.9):

@collection = UserLevel.all
@filtered_collection = @collection.select { |l| l.blah2_id == 3 }

Ruby的Array类非常强大,值得研究:http://www.ruby-doc.org/core/classes/Array.html

在Ruby 1.8中,等效方法是Enumerable#find_all

@filtered_collection = @collection.find_all { |l| l.blah2_id == 3 }

答案 1 :(得分:1)

恕我直言,如果你调整你的数据库查询来获取所需的对象会更好。在大型阵列上使用Array#select非常慢。

原因 - 您将整个数组对象加载到内存中。然后,Array #select将在每个元素上运行块。极其内存密集型操作。您可能没有在开发计算机上意识到这一点,但是当您在具有> 5k记录的阵列上运行此类操作时,您会感受到热量。