首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >update与update_attributes的区别

update与update_attributes的区别
EN

Stack Overflow用户
提问于 2018-12-18 09:49:07
回答 5查看 15.8K关注 0票数 8

在Rails 5中,update和update_attributes方法的区别是什么?我看到了这两种方法的如下结果

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

在更新方法方面,在活动记录关系中引入了一种新的方法。我听不懂。有什么关系?

此外,我们在Rails 5中使用的是update_attributes,在活动记录文档中没有使用它。

我对所有的更新方法都很困惑。我需要澄清

EN

回答 5

Stack Overflow用户

发布于 2019-05-29 23:58:27

从Rails 4.0.2开始,如果更新失败,#update将返回false。在Rails 4.0.2之前,#update返回被更新的对象。因此,主要的区别是返回值。在进行此更改之后,#update_attributes只是#update的别名。在Rails 6中,似乎存在反对#update_attributes的谈判,因为Rails 6尚未发布。

票数 8
EN

Stack Overflow用户

发布于 2018-12-18 13:02:52

从rails 5文件看来,update可以用于更新多个对象(记录数组),但是update_attributes只在单个记录上工作,否则两者是相同的。

来自update_attributes的rails核心文件:

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

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

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

代码语言:javascript
复制
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,user_name:"Samuel",group:"expert")

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

根据relation = Person.where(group:"expert") people.update(group:“master”)的结果更新多条记录

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

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2019-01-29 06:52:17

当我们使用update_column时,时间更新是在数据库级别上完成的,因此没有任何与rails ORM的联系,所以无论我们实现了什么逻辑,比如回调和验证,都将是浪费的,而且不会有用,因为这将被绕过。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53830310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档