web-dev-qa-db-fra.com

Filtrage sur activer la relation sans requête SQL supplémentaire?

Comment filtrer les résultats d'une requête AR sans exécuter une requête supplémentaire?

par exemple.

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

Je ne veux pas que la deuxième requête appelle la base de données, mais plutôt filtre sur les résultats récupérés dans u (1ère requête).

28
Derek

Le ActiveRecord:Relation interroge la base de données uniquement lorsque ses éléments sont accessibles. Ainsi, la séquence que vous avez n'appellera pas du tout la base de données, sauf si vous écrivez quelque chose comme u.first ou tens.first.

C'est un peu différent dans Rails console car les résultats de chaque instruction sont imprimés sur la console afin qu'elle exécute la requête à chaque fois. Vous pouvez ignorer l'impression en ajoutant ; 1 après chaque instruction.

Cela mis à part, si vous souhaitez toujours filtrer les résultats avec la première requête:

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