(Rails) 何时使用 ActiveRecord 的 .where 和 .select
(Rails) When to use ActiveRecord's .where and .select
我的 Rails 应用程序中有一个名为 User
的模型,它有一个属性 name
假设我想找到所有 Users
的 name
匹配特定字符串。
在 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" - 但这不是您在问题中处理的用途)
我的 Rails 应用程序中有一个名为 User
的模型,它有一个属性 name
假设我想找到所有 Users
的 name
匹配特定字符串。
在 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" - 但这不是您在问题中处理的用途)