我有一个用户ID数组。在Rails控制台中,是否有一种方法可以使用该数组查询所有这些用户?
类似于:
ids = [1, 2, 3, 4]
users = User.find(ids)
并且使其返回所有4个用户?
我有一个用户ID数组。在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在评论中指出的那样,使用range会导致SQL BETWEEN子句,而使用数组会导致SQL IN子句。
不要使用User.find_by_id()
-- 无论您传递多少个ID,它都只会返回一个记录。
Array
。而 .where 返回 ActiveRecord::Relation
。 - Neeraj你可以使用 User.where(id: ids)
find_all_by_id
已被弃用,请使用where
。 - swilliamsUser.where(id: [1,2,3,4])
。 - Obromios使用扩展运算符:
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)
当所以id都存在时,你正在做的应该起作用。
你看到异常的原因可能是因为这些id中至少有一个在数据库中不存在。
如果你不想得到异常,可以使用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)