ruby-on-rails - (Rails) 何时使用 ActiveRecord 的 .where 和 .select

标签 ruby-on-rails ruby-on-rails-3 activerecord

我的 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/

相关文章:

ruby-on-rails - Ruby - 如何在不重新编码已经编码的字符的情况下编码 URL

ruby-on-rails - rails : Serializing deeply nested associations with active_model_serializers

ruby-on-rails - 如何使用 Carrierwave 上传自定义 S3 元数据

ruby-on-rails - 如何在路由级别重定向,而不是在操作级别?

ruby-on-rails - 如果我使用 GUID 作为主键,那么使用 Rails 3.1 的 COMB GUID 是个好主意吗?

html - <p> 如何显示一个变量

ruby-on-rails - 我应该首先学习的前 10-15 个 Rails View 助手?

ruby-on-rails - 无法构建 native 扩展

ruby-on-rails - ActiveRecords 未调用正确的 SQL 语句

c# - LINQ to SQL 中的多态关联