我的 Rails 应用程序中有一个名为 User
的模型,它有一个属性 name
假设我想查找名称
与特定字符串匹配的所有用户
。
在 Rails 控制台中,我可以这样做:
选项 1
User.where("name LIKE 'string'")
这非常快。
选项 2
User.select{|u| u.name ==“字符串”}
这非常慢。它适用于小型数据库,但如果您有数十万个用户,这似乎会尝试首先将所有用户
加载到内存中,然后在 block 中迭代它们。
这是否意味着选项 2 总是错误的?那么 .select
的正确用例是什么,什么时候它比 .where
更好?
我在我的应用程序中编写了一堆代码,使用 .select
运行良好,但现在我尝试在一个非常大的表上使用,我发现我可能做错了什么。
最佳答案
选择:http://apidock.com/rails/ActiveRecord/QueryMethods/select
“这将从数据库中为范围构建一个对象数组,将它们转换为数组并使用 Array#select 迭代它们。”
所以,它是如此缓慢,因为它从数据库中获取所有内容,将它们一一转换为 Ruby 对象,然后运行您给它们的 block 。如果您有一个包含 100,000 行的数据库表,这意味着实例化 100,000 个 ruby 对象并在它们上运行您的 block 。 Ruby 很慢,所以这也很慢。
使用 where
基本上只是将 SQL 语句放在一起,然后让数据库处理它。数据库速度很快——如果速度是优先考虑的,那么只要你可以遵循数据库,你就应该这样做。如果您有一个包含 100,000 行的数据库表,但只有 10 行与您的 where
查询匹配,那么数据库将处理过滤,而 Ruby 将仅接收回 10 行,因此只需实例化 10 个 Ruby对象,而不是 100,000 个。
几乎总是,您会想要使用 where
而不是 select
。那么,什么时候可以使用 select 呢?当您想要根据一些很难转换为 SQL 的 ruby 条件过滤相对少量的记录时,您可以使用它(通常与 where
结合使用)。
示例:
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
的第二种用法:“修改查询的 SELECT 语句,以便仅检索某些字段” - 但这不是您正在处理的用法在你的问题中)
关于ruby-on-rails - (Rails) 何时使用 ActiveRecord 的 .where 和 .select,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34034571/