追加のクエリを実行せずにARクエリの結果をフィルタリングするにはどうすればよいですか?
例えば.
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(最初のクエリ)で取得した結果をフィルター処理します。
ActiveRecord:Relation
は、その要素がアクセスされたときにのみdbをクエリします。したがって、u.first
やtens.first
のようなものを書かない限り、あなたが持っているシーケンスはdbをまったく呼び出しません。
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