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

sat*_*yam 8 ruby ruby-on-rails

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

如果我有这个,

@ house.colour = newcolour
@ house.save

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

我试着做

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

但它显示我的错误

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

谢谢你的任何建议

Dan*_*man 22

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

@house.update_attributes(:colour => newcolour)
Run Code Online (Sandbox Code Playgroud)

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

@house.update_attribute(:colour, newcolour)
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是错误的,至少对于Rails 3来说,因为这两种方法都会调用save in inside,因此所有更改都将被保存. (3认同)

Den*_*nis 10

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

  • update(attributes)

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

  • update!(attributes)

    更新其接收器就像更新但呼叫保存!而不是保存,因此如果记录无效,则会引发异常.

  • update_attribute(name, value)

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

    • 验证被跳过.

    • 调用回调.

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

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

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

  • 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.