web-dev-qa-db-ja.com

追加のSQLクエリなしでactiverecord関係をフィルタリングしますか?

追加のクエリを実行せずに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(最初のクエリ)で取得した結果をフィルター処理します。

28
Derek

ActiveRecord:Relationは、その要素がアクセスされたときにのみdbをクエリします。したがって、u.firsttens.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
35
tihom