rails如何正确地“更新”多个列 – (updated_at也应该更新)

我无法使用rails activerecords正确更新多个列。 我想使用像更新基本上更新updated_at的东西,但我不能通过多列。 我可以使用update_all但它不会使用当前时间戳更新updated_at。

这就是我想要的:

这不起作用:(只接受payment_total但不接受其余部分)

retval = @invoice.update(:payment_total => 20, :due_amount => 10, :data => clonedata.to_json) :data - this is actually a json field 

输出:

 nothing 

这工作:

  retval = Invoice.where(:id => @invoice.id).update_all(:payment_total => 20, :due_amount => 10, :data => clonedata.to_json) 

输出:(注意它没有更新“updated_at”字段)

SQL(1.1ms)UPDATE“发票”SET“payment_total”= ’30 .00’,“due_amount”= ’86 .00’,“data”='{“名称”:“测试}’WHERE”发票“。”id“= 6

单个参数可以工作:

 retval = @invoice.update(:payment_total => 20) 

输出:

 UPDATE "invoices" SET "due_amount" = $1, "updated_at" = $2 WHERE "invoices"."id" = 6 [["due_amount", "86.0"], ["updated_at", "2014-05-18 03:48:49.718692"]] 

现在我如何使用类似的东西来更新多个列,而updated_at也会更新当前的时间戳?

当你提到你想要update multiple columns – 我认为这将是一个单独的记录?


此行将更新collection响应( .where返回collection而不是单个object ):

 retval = Invoice.where(:id => @invoice.id).update_all(:payment_total => 20, :due_amount => 10, :data => clonedata.to_json) 

如果您要更新单个记录,我会使用这样的update方法 :

 @invoice = Invoice.update(params[id], payment_total: "20", due_amount: "10", data: clonedata.to_json) 

全部更新,此方法构造单个SQL UPDATE语句并将其直接发送到数据库。 它不会实例化所涉及的模型,也不会触发Active Record回调或validation。 传递给update_all的值不会通过ActiveRecord的类型转换行为。 它应该只接收可以按原样传递给SQL数据库的值。

因此,它不会触发回调或validation – 并且时间戳更新是在回调中进行的.update_at是回调

#update是你想要的方法。 如果它不能正常工作,那就意味着你没有按照自己的想法来调用它。 也许试试叫#update! 看看你是否收到exception?