rails 3:write_attribute和update_attribute之间的区别

时间:2011-05-27 22:32:27

标签: ruby-on-rails-3 activerecord

直到今天我才知道write_attribute ...

看起来像update_attribute,虽然没有调用验证仍然调用:before_save回调,而write_attribute没有。

这两种方法之间有区别吗?

2 个答案:

答案 0 :(得分:15)

update_attribute实际上对数据库进行了物理调用。您将完全执行UPDATE语句。它就像update_attributes,但仅适用于单个列。

虽然write_attribute将分配属性写入基于AR的列的模型。如果要覆盖基于数据库的属性。

def first_name=(val)
  write_attribute :first_name, val
end
# some_model.first_name => 'whatever val is'

def first_name=(val)
  @first_name = val
end
# some_model.first_name => nil

我没有广泛地研究过write_attribute,但是我收集基于Activerecord的模型处理基于数据库的列的赋值与略微不同于磨机访问器的运行。

答案 1 :(得分:12)

如果要覆盖方法的默认访问器,则使用

write_attribute。它基本上是self[:attribute]=(value)的语法糖。

查看“覆盖默认访问者”标题下的ActiveRecord::Base documentation

如果您尝试使用update_attribute重写文档中的示例,我想它会以循环结束。