【问题标题】:difference between find and find_by when modifying a record in-memory修改内存中的记录时 find 和 find_by 的区别
【发布时间】:2020-08-14 23:15:02
【问题描述】:

假设我有这两个类

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

我无法解释这种差异。

【问题讨论】:

  • 是否有可能不止一个 id = 1 的小部件?
  • 假设 id 是唯一的。
  • 确定 g.widgets.first 在这两种情况下是相同的 id 吗?
  • 我们甚至可以说这个小工具只有一个小部件。
  • 迷人的行为

标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    相关资源
    最近更新 更多