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