Ruby on rails RubyonRails在数据库中保存一个特定字段

Ruby on rails RubyonRails在数据库中保存一个特定字段,ruby-on-rails,ruby,Ruby On Rails,Ruby,我的数据库中有一个表,它是house,有很多字段,比如“颜色”、“价格”。更新后如何仅保存特定字段 如果我有这个 @house.color=newcolor @豪斯·萨弗 它将保存所有其他字段,包括house.color和house.price(在我的案例中,价格应与颜色同时以编程方式更新,但不应保存。数据库中只应保存house.color) 我试着去做 @house.color=newcolor @房子、颜色、保存 但它显示了我的错误 是否只能保存@house.color的值 感谢您的建议D

我的数据库中有一个表,它是house,有很多字段,比如“颜色”、“价格”。更新后如何仅保存特定字段

如果我有这个

@house.color=newcolor
@豪斯·萨弗

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

我试着去做

@house.color=newcolor
@房子、颜色、保存

但它显示了我的错误

是否只能保存@house.color的值


感谢您的建议

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

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

class House < ActiveRecord::Base
  def price
    return 100 if colour == "red"
    return 200
  end
end
class House
(这显然是一种“计算”价格的非常简单的方法)

现在您可以像以前一样使用
@house.price
,它取决于颜色,但不再是表字段


注意:如果计算复杂,您可以将其“缓存”在类变量中,并覆盖
color=
方法,以便在颜色更改时删除类变量。

您可以使用更新精确的字段集

可以使用更新单个字段


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

  • 从传入的散列更新模型的属性并保存记录,所有这些都包装在事务中。如果对象无效,则保存将失败并返回false

  • 更新其接收器,就像更新一样,但会调用save!而不是保存,因此如果记录无效,将引发异常

  • 更新单个属性并保存记录。这对于现有记录上的布尔标志尤其有用。还要注意

    • 跳过验证

    • 调用回调

    • 如果该列可用,则更新列上的updated_at/updated_on

    • 更新此对象中的所有脏属性

    如果属性标记为只读,此方法将引发一个
    ActiveRecord::ActiveRecordError

  • 更新的别名

  • 更新的别名

  • 相当于
    update\u列(name=>value)

  • 发出UPDATE SQL语句,直接在数据库中更新属性,并在接收方中设置它们

    这是更新属性的最快方法,因为它直接进入数据库,但要考虑到,因此,常规更新过程完全被忽略。特别是:

    • 跳过验证

    • 将跳过回调

    • 更新时间/更新时间不更新

    当对新对象调用或至少一个属性标记为只读时,此方法将引发
    ActiveRecord::ActiveRecordError


更新
更新
(因此
更新属性
更新属性!
)调用
保存
。因此,在您的情况下,您应该尝试使用
update\u column
update\u columns

我认为这是错误的,至少对于Rails 3来说是错误的,因为这两种方法都调用save-inside,所以所有更改都将被保存。这两种方法都将向数据库提交脏属性。
@house.update_attributes(:colour => newcolour)
@house.update_attribute(:colour, newcolour)