Итак, у меня есть массив идентификаторов пользователей. Есть ли способ в консоли 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()
- он вернет только одну запись, независимо от того, какие идентификаторы вы передадите.
ids = [3, 3, 1, 0, 3]; Model.find(ids).map(:id) == [0, 1, 3]; h = Model.find(ids.uniq).map{|o| [o.id, o]}.to_h; h.values_at(ids).map(:id) == [3, 3, 1, 0, 3]
- person Kanat Bolazar; 29.10.2015
find
к where
к одному и тому же запросу sql?
- person trigun0x2; 08.11.2015
вы можете использовать User.where(id: ids)
find_all_by_id
устарел, поэтому используйте where
.
- person swilliams; 31.07.2014
User.where(id: [1,2,3,4])
- person Obromios; 09.02.2017
Используйте оператор splash:
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)
Все работают ..
вы можете использовать
Users.where({ id: [1,2,3 ,4]})
# SELECT * FROM users WHERE id IN (1,2,3,4)
То, что вы делаете, должно работать, когда существуют все идентификаторы.
Причина, по которой вы можете увидеть исключение, заключается в том, что хотя бы один из этих идентификаторов не существует в базе данных.
Вместо этого вы хотите использовать 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)