rails 3:write_attribute和update_attribute之间的区别

sta*_*p75 13 activerecord ruby-on-rails-3

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

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

这是两种方法的区别吗?

now*_*owk 15

update_attribute实际上是对DB进行物理调用.您将完整执行一条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
Run Code Online (Sandbox Code Playgroud)

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


Dou*_*rer 12

write_attribute当您要覆盖方法的默认访问器时使用.它本质上是语法糖self[:attribute]=(value).

查看"覆盖默认访问者"标题下的ActiveRecord :: Base文档.

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