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).
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