web-dev-qa-db-fra.com

Rails La console recherche des utilisateurs par un tableau d'identifiants

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?

43
Seth

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.

107
Grant Birchmeier

vous pouvez utiliser User.where(id: ids)

16
Nitin Jain

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.

4
BroiSatse

vous pouvez utiliser

   Users.where({ id: [1,2,3 ,4]})
 # SELECT * FROM users WHERE id IN (1,2,3,4)
2
Tarek Saied

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

2
Dheer

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)
1
Abdo