修改内存中的记录时find和find_by之间的区别

问题描述

说我有这两个班

class Gadget < ActiveRecord::Base
  has_many :widgets
end

class Widget < ActiveRecord::Base
  belongs_to :gadget
  # table has string attribute .color
end

假设数据库包含一个小工具和一个小部件,每个小部件都带有id = 1,并且该小部件的颜色为nil

修改通过.find检索到的记录

g = Gadget.first
w = g.widgets.find { |widg| widg.id == 1 }
w.color = "blue"
g.widgets.first.color
=> "blue"

修改通过.find_by检索到的记录

g = Gadget.first
w = g.widgets.find_by(id: 1)
w.color = "blue"
g.widgets.first.color
=> nil

我无法解释这种差异。

解决方法

如果使用find_by方法,rails将find_by语句添加到查询的末尾,因此将只有一条记录加载到内存中(如果有),并且DB可以在此处找到该记录。如果对块使用find方法,rails首先将所有小部件加载到内存中,然后它将为给定语句搜索特定的小部件,这将导致额外的内存使用,因为DB可以完成相同的工作。另外,如果您像这样使用find方法:g.widgets.find(1),将与g.widgets.find_by(id: 1)方法相同。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...