2013-10-23 12 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 

2番目のクエリでdbを呼び出すのではなく、u(1番目のクエリ)で取得した結果をフィルタリングします。

答えて

27

ActiveRecord:Relationは、要素にアクセスするときにのみdbにクエリを実行します。したがって、あなたが持っているシーケンスは、u.firsttens.firstのようなものを書かない限り、データベースを呼び出すことは全くありません。

Railsコンソールでは、各文の結果​​がコンソールに表示されるため、毎回クエリを実行するため、コンソールとは多少異なります。各明細の後に; 1を追加して印刷をスキップできます。それでも最初のクエリで結果をフィルタリングする場合はさておき、

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

コンソールが返されたオブジェクトの 'inspect'を呼び出し、これを出力します。 'ActiveRecord :: Relation'の' inspect'メソッドはレコードhttp:// apiをロードして返す 'to_a' http://api.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-inspectを呼び出します.rubyonrails.org/classes/ActiveRecord/Relation.html#method-i-to_aを実行して、すでに必要なクエリを実行しています。 – kristinalim

+1

また、私は '; 'nil'を追加するのではなく; p 1 'である。ちょうど '; 1 'は実際には既に十分である。 – kristinalim

+0

@kristinalimが真実であるといいます – tihom