(Rails) 何时使用 ActiveRecord 的 .where 和 .select

(Rails) When to use ActiveRecord's .where and .select

我的 Rails 应用程序中有一个名为 User 的模型,它有一个属性 name

假设我想找到所有 Usersname 匹配特定字符串。

在 Rails 控制台中,我可以做:

选项 1

User.where("name LIKE 'string'")

这非常快。

选项 2

User.select{|u| u.name == "string"}

这非常慢。它适用于小型数据库,但如果您有数十万用户,这似乎会尝试先将所有 Users 加载到内存中,然后在块中迭代它们。

这是否意味着选项 2 总是错误的? .select 的正确用例是什么,什么时候比 .where 更可取?

我在我的应用程序中编写了一堆代码,使用 .select 运行良好,但现在我尝试使用非常大的 table,我发现我可能做错了什么。

Select: http://apidock.com/rails/ActiveRecord/QueryMethods/select

"This will build an array of objects from the database for the scope, converting them into an array and iterating through them using Array#select."

所以,它太慢了,因为它从数据库中获取所有内容,将它们一一转换为 Ruby 对象,然后运行你给它们的块。如果您有一个包含 100,000 行的数据库 table,这意味着实例化 100,000 个 ruby 对象和 运行 您在它们上面的块。 Ruby 很慢,所以这个很慢。

使用where基本上只是将一个SQL语句放在一起,让数据库处理它。数据库是快速的——如果速度是优先考虑的,那么只要你可以服从数据库,你就应该这样做。如果您的数据库 table 有 100,000 行,但只有 10 行匹配您的 where 查询,那么数据库将处理过滤,而 Ruby 将只接收 10 行,因此只会必须实例化 10 个 Ruby 个对象,而不是 100,000 个。

几乎总是,您会希望使用 where 而不是 select。那么,什么时候可以使用 select?好吧,当你想根据一些 ruby 条件过滤相对较少的记录时,你会使用它(通常与 where 结合使用,这些记录相当难以转换为 SQL .

示例:

User.where(account_cancelled: true).select do |u|
  # perform complex ruby logic on user 
  # that would be hard to do with plain SQL
  # (note, this will only act on the subset of 
  # users returned from the where clause)
end

因此,只要您合理地可以使用 where 而不是 select,您就应该这样做。

(文档中还提到了 select 的第二次使用:"Modifies the SELECT statement for the query so that only certain fields are retrieve" - 但这不是您在问题中处理的用途)