当前位置:  开发笔记 > 后端 > 正文

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

如何解决《(Rails)何时使用ActiveRecord的.where和.select》经验,为你挑选了1个好方法。

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

比方说,我想找到的所有Usersname特定的字符串相匹配.

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

选项1

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

这非常快.

方案2

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

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

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

我在我的应用程序中编写了一堆代码正常使用.select,但现在我尝试在一个非常大的表上使用我看到我可能做错了什么.



1> joshua.palin..:

选择:http://apidock.com/rails/ActiveRecord/QueryMethods/select

"这将从数据库为范围构建一个对象数组,将它们转换为数组并使用Array#select迭代它们."

所以,它很慢,因为它从数据库中取出一切,逐个将它们转换为Ruby对象,然后运行你给它们的块.如果您有一个包含100,000行的数据库表,则表示实例化100,000个ruby对象并在其上运行块.Ruby很慢,所以这很慢.

使用where将基本上只是组合一个SQL语句,让数据库处理它.数据库是快速的 - 如果速度是优先级,那么每当你可以推迟数据库时,你应该这样做.如果你有一个包含100,000行的数据库表,但只有10个匹配你的where查询,那么数据库将处理过滤,而Ruby只会返回10行,因此只需要实例化10个Ruby对象,而不是100,000.

几乎总是,你会想要where而不是select.那么,你什么时候可以选择?where当你想根据一些相当难以转换为SQL的ruby条件过滤相对少量的记录时,你会使用它(通常与它结合使用).

例:

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语句,以便只检索某些字段" - 但这不是你在问题中处理的用途)


添加了一个例子
推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有