在Rails 5中,update和update_attributes方法之间有什么区别。我看到两种方法的结果如下
以及有关更新方法的新记录,在活动记录关系中引入了。我听不懂有什么区别?
此外,我们是否在Rails 5中使用update_attributes。活动记录文档中没有该更新。
我对所有更新方法感到困惑。我需要澄清
答案 0 :(得分:1)
从Rails 5文件看来,update在我看来可以用于更新多个对象(记录数组),但update_attributes仅适用于单个记录,否则两者相同
从rails核心文件获取update_attributes:
更新单个属性并保存记录。 这对于现有记录上的布尔标志特别有用。还请注意
如果该方法引发了ActiveRecord :: ActiveRecordError 属性标记为只读。
def update_attribute(name, value)
name = name.to_s
verify_readonly_attribute(name)
public_send("#{name}=", value)
save(validate: false)
end
用于更新
如果验证通过,则更新一个或多个对象并将其保存到数据库。 无论对象是否成功保存到数据库中,都将返回结果对象。
====参数
====示例
#更新一条记录 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