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

时间:2014-05-18 03:59:31

标签: ruby-on-rails activerecord ruby-on-rails-4 postgresql-9.2

我无法使用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',"数据" ='{“name”:“Test}'在哪里"发票"。" 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也会更新当前的时间戳?

3 个答案:

答案 0 :(得分:2)

当你提到你想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)

如果您要更新单个记录,我会use the update method这样:

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

#update是你想要的方法。如果它无法正常工作,那就意味着您没有按照自己的方式调用它。也许尝试调用#update!并查看是否收到异常?