Rails控制台:通过ID数组查找用户

61

我有一个用户ID数组。在Rails控制台中,是否有一种方法可以使用该数组查询所有这些用户?

类似于:

ids = [1, 2, 3, 4]

users = User.find(ids)

并且使其返回所有4个用户?


2
它是有效的。您可以将ID数组传递给模型的查找方法,并且只要它们都是现有的ID,您就会收到这些ID对应的用户数组。 - DiegoSalazar
没想到这个能用...哈哈。应该测试一下的。 - Seth
6个回答

139

对于数组,你可以使用以下之一:

# 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,它都只会返回一个记录。


1
我的实际数组不是从1到4。例如,ID是零散的122、323、451。我仍然可以实现吗? - Seth
3
这里有一些不准确的地方:User.find((1..4).to_a) 可以使其正常工作。并且:1..4 会创建一个“范围”(Range),而不是一个“数组”(Array)。 - DiegoSalazar
2
是的,需要注意的是传递一个范围(User.find_all_by_id(1..4))将执行一个 SQL BETWEEN 子句,而传递一个数组将执行一个 SQL IN 语句。 - DiegoSalazar
编辑以添加Rails 4首选版本。 - Grant Birchmeier
1
.find 返回 Array。而 .where 返回 ActiveRecord::Relation - Neeraj
显示剩余2条评论

17

你可以使用 User.where(id: ids)


13
在Rails 4中,find_all_by_id已被弃用,请使用where - swilliams
在Rails 5中,似乎根本不起作用,所以一定要使用User.where(id: [1,2,3,4]) - Obromios

4

使用扩展运算符:

ids = [1, 2, 3, 4]

users = User.find(*ids)

请注意,如果未找到任何用户,它将引发异常。

哦,那很不错。我不知道那个。 - Grant Birchmeier
1
你不需要使用splat,find函数可以很好地处理数组。 - DiegoSalazar
我也发现了。星号没有任何作用。 - Grant Birchmeier

4

这对我来说是一项工作...

ids = [1, 2, 3, 4]

users = User.find(ids)

users = User.find(*ids)

users = User.find_all_by_id(ids)

所有功能均正常运行。


2
您可以使用

标签。

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

我鼓励您扩展此答案以提供一些解释。仅包含代码的答案对于不熟悉问题中概念的其他用户来说并没有提供太多信息。 - psubsee2003

2

当所以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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接