我的数据库中有一个表是房子,有很多字段,如“颜色”,“价格”。如何在更新后仅保存特定字段
如果我有这个,
@ house.colour = newcolour
@ house.save
它将保存所有其他字段,包括house.colour和house.price
(我的情况下,价格应该以编程方式同时更新颜色,但不应保存。只有house.colour应该保存在数据库中)
我试着做
@ house.colour = newcolour
@ house.colour.save
但它显示错误
是否只能保存@ house.colour的值?
感谢您提出任何建议
答案 0 :(得分:22)
您可以使用update_attributes更新一组精确的字段。
@house.update_attributes(:colour => newcolour)
您可以使用update_attribute更新单个字段。
@house.update_attribute(:colour, newcolour)
答案 1 :(得分:10)
有几种方法可以更新持久对象的特定字段。
从传入的哈希中更新模型的属性并保存记录,所有记录都包含在事务中。如果对象无效,则保存将失败并返回false。
更新其接收器就像更新一样但是调用保存!而不是保存,因此如果记录无效,则会引发异常。
更新单个属性并保存记录。这对现有记录上的布尔标志特别有用。另请注意
跳过验证。
调用回调。
如果该列可用,则更新updated_at / updated_on列。
更新此对象中所有脏的属性。
如果属性标记为只读,则此方法会引发
ActiveRecord::ActiveRecordError
。
的别名
update
update_attributes!(attributes)
的别名
update!
相当于
update_columns(name => value)
直接在发出UPDATE SQL语句的数据库中更新属性,并将它们设置在接收器中。
这是更新属性的最快方法,因为它直接进入数据库,但考虑到因此完全绕过了常规更新过程。特别是:
跳过验证。
跳过回调。
updated_at / updated_on未更新。
当调用新对象时,或者至少有一个属性被标记为只读时,此方法会引发
ActiveRecord::ActiveRecordError
。
update
和update!
(因此update_attributes
和update_attributes!
)致电save
。因此,在您的情况下,您应该尝试使用update_column
或update_columns
。
答案 2 :(得分:1)
DanSingerman的答案显示了如何更新单个字段。
但是,如果价格是纯粹计算的价值,则它不应该是您表格中的字段。但是模型中的方法是:
class House < ActiveRecord::Base
def price
return 100 if colour == "red"
return 200
end
end
(这显然是一种非常简单的'计算'价格的方法)
现在您可以像以前一样使用@house.price
,它取决于颜色,但它不再是表格字段。
注意:如果计算很复杂,您可以将其“缓存”在类变量中,并覆盖colour=
方法以在颜色更改时删除类变量。