我无法使用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也会更新当前的时间戳?
答案 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!
并查看是否收到异常?