在活动记录结果数组中查找

Finding in array of active record results

我正在使用活动记录创建数组。

users = User.all.to_a

现在我想稍后在此数组中查找用户 ID:1

users.find(1)

但它没有给出结果,而是 return 一切。如何在此结果数组中搜索我选择的用户 ID。我可以看到 users 是一个 array 但在数组中有 User 对象的每个记录。

如果我执行以下操作

user.first

是return用户对象,但是我想搜索,怎么办。我知道如果我删除 to_a 那么它会起作用,但它会创建另一个 sql 查询。

因为它是一个对象数组,所以你应该使用 find with block:

users.find { |user| user.id == 1 }

User.find(1) 是一个 ActiveRecord::FinderMethod。但是当您已经将所有记录加载到内存中时,这些记录将转换为 User 的实例并存储在数组中。因此,您需要使用在 Array 上实现的 findselect,如下所示:

users.find { |user| user.id == 1 }   #=> returns the first found record
users.select { |user| user.id == 1 } #=> returns an array with all found record

请记住,如果设置得当,数据库查询可以使用高效的索引。这使得数据库查询非常快。当您将所有记录加载到内存中时,这些记录需要转换为适当的实例。并且在数组上搜索不能使用任何索引,这意味着它可能(取决于数组的大小)比新的数据库查询慢。