2013-10-23 22 views
19

如何在不执行额外查询的情况下过滤AR查询的结果?在没有附加sql查询的情况下过滤activerecord关系?

例如

u = User.where(name: "bob", age: [10, 20]) 
# 1st select query to db 
u.class # ActiveRecord::Relation 
tens = u.where(age: 10) 
# 2nd select query to db 

我不想第二个查询调用数据库,而是过滤在u(第一个查询)中检索到的结果。

回答

27

ActiveRecord:Relation仅在访问其元素时才查询数据库。因此,除非你写了类似u.firsttens.first的东西,否则你所拥有的序列根本不会调用数据库。

它在Rails控制台中有点不同,因为每个语句结果都被打印到控制台,所以它每次都执行查询。您可以在每个陈述后添加; 1以跳过打印。

这且不说,如果你仍然想为过滤与第一查询的结果:控制台调用返回的对象,并打印了这一点,在`inspect`

u = User.where(name: "bob", age: [10, 20]) # no query at this point 
u.class # ActiveRecord::Relation 
u.first # query to db 
u.class # Array 

tens = u.select{|x| x.age == 10} # no query to db 
+1

。检查'ActiveRecord :: Relation'的方法调用'to_a'加载并返回记录的方法http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-inspect http:// api .rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-to_a,因此已经执行了所需的查询。 – kristinalim

+1

另外,我使用'; nil'而不是追加'; p 1'。只是'; 1'实际上已经足够了。 – kristinalim

+0

@kristinalim真实和更好 – tihom

相关问题