J'ai donc un tableau d'identifiants d'utilisateurs. Existe-t-il un moyen dans la console Rails d’interroger tous les utilisateurs avec le tableau
quelque chose comme
ids = [1, 2, 3, 4]
users = User.find(ids)
et le faire revenir tous les 4 utilisateurs?
Pour un tableau, vous pouvez utiliser l'un de ceux-ci:
# Will raise exception if any value not found
User.find( [1,3,5] )
# Will not raise an exception
User.find_all_by_id( [1,3,5] ) # Rails 3
User.where(id: [1,3,5]) # Rails 4
Si vous utilisez une plage, vous pouvez utiliser celles-ci:
# Will raise exception if any value not found
User.find((1..4).to_a) #same as User.find([1,2,3,4])
# Will not raise an exception
User.find_all_by_id(1..4) # Rails 3
User.where(id: 1..4) # Rails 4
Comme @ diego.greyrobot le note dans un commentaire, une plage entraîne une clause SQL BETWEEN, alors qu'un tableau entraîne une clause SQL IN.
ne pas utiliser User.find_by_id()
- Il ne renverra qu'un seul enregistrement, peu importe la façon dont les identifiants multiples que vous transmettez sont transmis.
vous pouvez utiliser User.where(id: ids)
Utiliser l'opérateur splash:
ids = [1, 2, 3, 4]
users = User.find(*ids)
Notez qu'il déclenchera une exception s'il ne parvient pas à trouver l'un des utilisateurs.
vous pouvez utiliser
Users.where({ id: [1,2,3 ,4]})
# SELECT * FROM users WHERE id IN (1,2,3,4)
C'est un travail pour moi ...
ids = [1, 2, 3, 4]
users = User.find(ids)
users = User.find(*ids)
users = User.find_all_by_id(ids)
Tous travaillent ..
Ce que vous faites est censé fonctionner lorsque tous les identifiants existent.
La raison pour laquelle vous pouvez voir une exception est qu’au moins un de ces identifiants n’existe pas dans la base de données.
Au lieu de cela, vous voulez utiliser find_all_by_id
si vous ne voulez pas obtenir d’exception:
User.find_all_by_id([1, 2, 3, 4])
# Does the following sql:
User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2, 3, 4)