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

时间:2011-01-04 11:59:27

标签: ruby-on-rails ruby

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

如果我有这个,

  

@ house.colour = newcolour   
@ house.save

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

我试着做

  

@ house.colour = newcolour   
  @ house.colour.save

但它显示错误

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

感谢您提出任何建议

3 个答案:

答案 0 :(得分:22)

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

@house.update_attributes(:colour => newcolour)

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

@house.update_attribute(:colour, newcolour)

答案 1 :(得分:10)

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

  • update(attributes)

      

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

  • update!(attributes)

      

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

  • update_attribute(name, value)

      

    更新单个属性并保存记录。这对现有记录上的布尔标志特别有用。另请注意

         
        
    • 跳过验证。

    •   
    • 调用回调。

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

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

    •   
         

    如果属性标记为只读,则此方法会引发ActiveRecord::ActiveRecordError

  • update_attributes(attributes)

      

    update

    的别名
  • update_attributes!(attributes)

      

    update!

    的别名
  • update_column(name, value)

      

    相当于 update_columns(name => value)

  • update_columns(attributes)

      

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

         

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

         
        
    • 跳过验证。

    •   
    • 跳过回调。

    •   
    • updated_at / updated_on未更新。

    •   
         

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

updateupdate!(因此update_attributesupdate_attributes!)致电save。因此,在您的情况下,您应该尝试使用update_columnupdate_columns

答案 2 :(得分:1)

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

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

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

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

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

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