Ruby on Rails 在数据库中保存特定字段

问题描述 投票:0回答:3

我的数据库中有一个名为 house 的表,其中有许多字段,例如“颜色”、“价格”。如何在更新后只保存特定字段

如果我有这个,

@house.colour = 新颜色
@house.save

它将保存所有其他字段,包括 house.colour 和 house.price
(我的情况,价格应该与颜色同时以编程方式更新,但不应该保存。只有 house.colour 应该保存在数据库中)

我试着做

@house.colour = 新颜色
@house.color.save

但它显示我错误

是否可以只保存@house.colour的值?

谢谢您的建议

ruby-on-rails ruby
3个回答
28
投票

您可以使用 update_attributes 更新一组精确的字段。

@house.update_attributes(:colour => newcolour)

您可以使用 update_attribute 更新单个字段。

@house.update_attribute(:colour, newcolour)

22
投票

有几种方法可以更新持久对象的特定字段。

根据传入的哈希更新模型的属性并保存记录,所有这些都包含在事务中。如果对象无效,则保存失败,返回 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


2
投票

DanSingerman 的答案展示了如何更新单个字段。

但是,如果价格是纯粹计算的值,则它不应该是表中的字段。但是你的模型中有一个方法:

class House < ActiveRecord::Base
  def price
    return 100 if colour == "red"
    return 200
  end
end

(这显然是一种非常简单的“计算”价格的方法)

现在您可以像以前一样使用

@house.price
,它取决于颜色,但它不再是表格字段。

注意: 如果计算很复杂,您可以将其“缓存”在类变量中,并重写

colour=
方法以在颜色变化时擦除类变量。

© www.soinside.com 2019 - 2024. All rights reserved.