update 和 update_attributes 的区别

Sam*_*Sam 5 ruby-on-rails-5 ruby-on-rails-5.1 ruby-on-rails-5.2

在 Rails 5 中,update 和 update_attributes 方法有什么区别。我看到这两种方法的以下结果

  1. 返回真/假
  2. 检查活动记录验证
  3. 回调被触发

并且关于更新方法,在活动记录关系中引入了一个新东西。我无法理解。有什么不同?

此外,我们在 Rails 5 中使用了 update_attributes。它不在活动记录文档中。

我对所有更新方法感到困惑。我需要清晰

stc*_*cho 5

从 Rails 4.0.2 开始,#update如果更新失败,则返回 false。在 Rails 4.0.2 之前, #update返回更新的对象。因此,主要区别在于返回值。在此更改后,#update_attributes只是 的别名#update。似乎有关于#update_attributes在尚未发布的 Rails 6 中弃用的讨论。

  • 弃用 `update_attributes`/`!`,转而使用 `update`/`!`。在 Rails 6 中。所以意思是 update/! 将不再是 update_attributes 的别名。如果我的理解有误,请纠正我。 (2认同)

Tho*_*rin 2

从rails 5文件看来,更新可用于更新多个对象(记录数组),但 update_attributes 仅适用于单个记录,否则两者是相同的

来自 update_attributes 的 Rails 核心文件:

更新单个属性并保存记录。这对于现有记录上的布尔标志特别有用。另请注意

  • 验证被跳过。
  • \调用回调。
  • 如果 update_at/updated_on 列可用,则更新该列。
  • 更新该对象中所有脏的属性。

如果该属性被标记为只读,则此方法将引发 ActiveRecord::ActiveRecordError。

def update_attribute(name, value)
  name = name.to_s
  verify_readonly_attribute(name)
  public_send("#{name}=", value)

  save(validate: false)
end
Run Code Online (Sandbox Code Playgroud)

用于更新

如果验证通过,则更新一个对象(或多个对象)并将其保存到数据库。无论对象是否成功保存到数据库,都会返回结果对象。

====参数

  • +id+ - 这应该是要更新的 id 或 id 数组。
  • +attributes+ - 这应该是属性的哈希值或哈希值数组。

==== 示例

# 更新一条记录 Person.update(15, user_name: "Samuel", group: "expert")

# 更新多条记录 people = { 1 => { "first_name" => "David" }, 2 => { "first_name" => "Jeremy" } } Person.update(people.keys, people.values)

# 根据关系结果更新多条记录 people = Person.where(group: "expert") people.update(group: "masters")

注意:更新大量记录将为每条记录运行 UPDATE 查询,这可能会导致性能问题。当不需要为每个记录更新运行回调时,最好使用 {update_all}[rdoc-ref:Relation#update_all] 来更新单个查询中的所有记录。

def update(id, attributes)
  if id.is_a?(Array)
    id.map { |one_id| find(one_id) }.each_with_index { |object, idx|
      object.update(attributes[idx])
    }
  else
    if ActiveRecord::Base === id
      raise ArgumentError,
        "You are passing an instance of ActiveRecord::Base to `update`. " \
        "Please pass the id of the object by calling `.id`."
    end
    object = find(id)
    object.update(attributes)
    object
  end
end
Run Code Online (Sandbox Code Playgroud)