我最近'发现'了update_attribute方法。所以,我开始改变像
这样的序列self.attribute = "foo"; save
中的模型或控制器方法中的
self.update_attribute(:attribute, "foo")
现在,我越是这样做,我就越想知道这是否是“良好做法”,以及这种方法是否打算以这种方式使用。
来自“专业人士”的任何输入?
答案 0 :(得分:1)
我建议将update_attribute
用于标志或任何不需要验证的更新操作,因为它不会触发验证。从rails文档我们可以阅读:
更新单个属性并保存记录而不经过 正常的验证程序。这对布尔值特别有用 现有记录上的标志。 Base中的常规update_attribute方法 当混合验证模块时,将替换为this 它是默认的。
update_attributes
确实:
更新传入的Hash中的所有属性并保存 记录。如果对象无效,则保存将失败,false将失败 被退回。
现在让我们看一下代码:
def update_attribute(name, value)
send(name.to_s + '=', value)
save(false)
end
def update_attributes(attributes)
self.attributes = attributes
save
end
答案 1 :(得分:0)
如果您需要使用简单数据更新单个实例,最好使用update_attribute或update_attributes,因为您可以阅读“UPDATE”并知道您正在“更新”。
您还必须知道有一个名为update_column的方法,它确实“有点”相同的东西,但是,update_column不会更新数据库上的updated_at时间戳。
此外,如果需要使用相同的值编辑数据库中的大量实例/行,则可以使用名为update_all的方法。这是一个例子
@instances = Instance.all
@instances.update_all(:attribute, value)
,这将更新该表的所有属性。执行werid迁移后,您会发现这很有用。
除此之外,您总是可以使用“保存”方式,当您必须计算大量数据来更新单个实例时,我强烈建议您这样做。这是一个例子:
#BAD
def updater_method
foo = Bar.first
foo.update_attributes(attr_one: some_calcule_method, attr_two: some_other_calcule_method, attr_three: some_more_calcule_method)
end
#GOOD
def saver_method
foo = Bar.first
foo.attr_one = some_calcule_method
foo.attr_two = some_other_calcule_method
foo.attr_three = some_more_calcule_method
etc
foo.save!
end
这将帮助您进行重新布局,因此如果任何方法失败,您可以清楚地看到它,包括行号和所有内容。
问候,卢卡斯。