直到今天我才知道write_attribute ...
看起来像update_attribute,虽然没有调用验证仍然调用:before_save回调,而write_attribute没有。
这两种方法之间有区别吗?
答案 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
重写文档中的示例,我想它会以循环结束。