Итак, у меня есть массив идентификаторов пользователей. Есть ли способ в консоли rails запросить всех этих пользователей с массивом
что-то вроде
ids = [1, 2, 3, 4]
users = User.find(ids)
и вернуть ли он всех 4 пользователей?
Итак, у меня есть массив идентификаторов пользователей. Есть ли способ в консоли rails запросить всех этих пользователей с массивом
что-то вроде
ids = [1, 2, 3, 4]
users = User.find(ids)
и вернуть ли он всех 4 пользователей?
Для массива вы можете использовать один из них:
# 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
Если вы используете диапазон, вы можете использовать их:
# 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
Как отмечает @diego.greyrobot в комментарии, диапазон вызывает предложение SQL BETWEEN, тогда как массив вызывает предложение SQL IN.
Не использовать User.find_by_id()
- он будет возвращать только одну запись, независимо от того, как могут проходить идентификаторы.
вы можете использовать User.where(id: ids)
Использовать оператор всплеска:
ids = [1, 2, 3, 4]
users = User.find(*ids)
Обратите внимание, что это вызовет исключение, если он не найдет никого из пользователей.
Это работа для меня...
ids = [1, 2, 3, 4]
users = User.find(ids)
users = User.find(*ids)
users = User.find_all_by_id(ids)
Все работают..
То, что вы делаете, должно работать, когда существуют все идентификаторы.
Причина, по которой вы можете увидеть исключение, состоит в том, что по крайней мере одна из этих идентификаторов не существует в базе данных.
Вместо этого вы хотите использовать find_all_by_id
, если вы не хотите получать исключение:
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)
вы можете использовать
Users.where({ id: [1,2,3 ,4]})
# SELECT * FROM users WHERE id IN (1,2,3,4)