使用常规属性分配并保存或使用update_attribute?

时间:2014-01-16 08:19:23

标签: ruby-on-rails ruby-on-rails-3.2

我最近'发现'了update_attribute方法。所以,我开始改变像

这样的序列
self.attribute = "foo"; save 

中的模型或控制器方法中的

self.update_attribute(:attribute, "foo")

现在,我越是这样做,我就越想知道这是否是“良好做法”,以及这种方法是否打算以这种方式使用。

来自“专业人士”的任何输入?

2 个答案:

答案 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

这将帮助您进行重新布局,因此如果任何方法失败,您可以清楚地看到它,包括行号和所有内容。

问候,卢卡斯。