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?