Sam*_*Sam 5 ruby-on-rails-5 ruby-on-rails-5.1 ruby-on-rails-5.2
在 Rails 5 中,update 和 update_attributes 方法有什么区别。我看到这两种方法的以下结果
并且关于更新方法,在活动记录关系中引入了一个新东西。我无法理解。有什么不同?
此外,我们在 Rails 5 中使用了 update_attributes。它不在活动记录文档中。
我对所有更新方法感到困惑。我需要清晰
从 Rails 4.0.2 开始,#update如果更新失败,则返回 false。在 Rails 4.0.2 之前, #update返回更新的对象。因此,主要区别在于返回值。在此更改后,#update_attributes只是 的别名#update。似乎有关于#update_attributes在尚未发布的 Rails 6 中弃用的讨论。
从rails 5文件看来,更新可用于更新多个对象(记录数组),但 update_attributes 仅适用于单个记录,否则两者是相同的
来自 update_attributes 的 Rails 核心文件:
更新单个属性并保存记录。这对于现有记录上的布尔标志特别有用。另请注意
如果该属性被标记为只读,则此方法将引发 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)
用于更新
如果验证通过,则更新一个对象(或多个对象)并将其保存到数据库。无论对象是否成功保存到数据库,都会返回结果对象。
====参数
==== 示例
# 更新一条记录 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)
| 归档时间: |
|
| 查看次数: |
8254 次 |
| 最近记录: |