update和update_attributes之间的区别

时间:2018-12-18 09:49:08

标签: ruby-on-rails-5 ruby-on-rails-5.1 ruby-on-rails-5.2

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

  1. 返回true / false
  2. 检查活动记录验证
  3. 触发回叫

以及有关更新方法的新记录,在活动记录关系中引入了。我听不懂有什么区别?

此外,我们是否在Rails 5中使用update_attributes。活动记录文档中没有该更新。

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

4 个答案:

答案 0 :(得分:1)

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

从rails核心文件获取update_attributes:

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

  • 验证已跳过。
  • \回调被调用。
  • updated_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

用于更新

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

====参数

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

====示例

#更新一条记录   Person.update(15,用户名:“ Samuel”,组:“专家”)

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

#根据关系结果更新多个记录   人= Person.where(组:“专家”)   people.update(组:“大师”)

注意:更新大量记录将运行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

答案 1 :(得分:0)

当我们使用update_column进行时间更新时,是在数据库级别进行的,因此与rails ORM没有任何联系,因此,无论我们实现什么逻辑(例如回调和验证),都将是浪费的,并且将无用。被绕过。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我发现 this 篇文章在短短 30 秒内解释得非常好。

.update

当您想返回 update 时使用 false,例如在 if/else 中:

if record.update(params)
  display_success
else
  react_to_problem
end

.update!

当您想要一个错误时使用update!(例如:为了避免无提示错误,如果错误是意外的并且您需要了解它以修复它,这可能会非常糟糕!):

  record.update!(params) # raises is invalid