所以我有一组用户ID。在rails控制台中是否有一种方法可以使用数组
查询所有这些用户类似
ids = [1, 2, 3, 4]
users = User.find(ids)
并让它返回所有4个用户?
答案 0 :(得分:104)
对于数组,您可以使用以下方法之一:
# 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()
- 无论您传递的ID如何,它都只会返回一条记录。
答案 1 :(得分:16)
您可以使用User.where(id: ids)
答案 2 :(得分:4)
使用splash操作符:
ids = [1, 2, 3, 4]
users = User.find(*ids)
请注意,如果找不到任何用户,它将引发异常。
答案 3 :(得分:2)
这对我有用......
ids = [1, 2, 3, 4]
users = User.find(ids)
users = User.find(*ids)
users = User.find_all_by_id(ids)
一切正常......
答案 4 :(得分:2)
你可以使用
Users.where({ id: [1,2,3 ,4]})
# SELECT * FROM users WHERE id IN (1,2,3,4)
答案 5 :(得分:1)
当所有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)