【发布时间】:2015-03-20 21:11:39
【问题描述】:
我正在尝试更新我的ticket 模型中的几个属性,但是因为ActiveRecord::Persistence#update 方法忽略了其中一个属性并更新了散列中传递的其他属性,所以我感到很困惑。
ticket_params = {"total_quantity"=>"0", "status"=>"refunded"}
ticket.update(ticket_params)
生成以下更新查询:
UPDATE `tickets` SET `status` = 'refunded', `updated_at` = '2015-03-20 21:01:48.145401' WHERE `tickets`.`id` = 307865
当我在哈希中有 3 个属性时会发生相同的行为。
ticket_params = {"total_quantity"=>0, "status"=>"refunded", billing_name: "TT"}
t.update(ticket_params)
生成的更新查询:
UPDATE `tickets` SET `status` = 'paid', `billing_name` = 'TT', `updated_at` = '2015-03-20 21:04:47.893160' WHERE `tickets`.`id` = 307865
所有这些参数都被标记为必需和允许的。在代码或数据库中的任何地方都找不到关于 total_quantity 属性的任何特别之处。
来自db/schema.rb:t.integer "total_quantity", limit: 4
更新: 感谢@creativereason 下面的 cmets。尝试直接更新 total_quantity 时的输出:
ticket.total_quantity
> 5
ticket.total_quantity = 6
> 6
ticket.total_quantity
> 6
ticket.save
> true
ticket.total_quantity
> 5
最终更新:
有一个 before_validation 回调将 total_quantity 设置回原始值。
【问题讨论】:
-
总量的现有值是多少?自 Rails 以来的古玩忽略 ActiveRecord 中未更改的值。您的 total_quantity 在数据库中也有默认值吗?
-
在这种情况下,它是 5。尝试使用不同的总数量值;相同的行为。表格中的总量没有默认值。
-
在一个示例中,您在 0 附近有引号,而在另一个示例中,您没有,但它似乎并没有以任何方式保存。你能提供你的模型的例子吗?只是想知道是否有任何具有属性安全性的东西(但这应该会引发
ForbiddenAttributesError错误但显然不是)..什么rails 4版本?使用普通ticket.total_quantity = 0时是否设置属性? -
ticket.total_quantity = 0; ticket.save不保存 :-)Rails 4.2.0 -
ticket.total_quantity是否显示属性的当前值?当您设置它然后检索它(保存之前)时,控制台中会发生什么?ticket.total_quantity = 0ticket.total_quantity
标签: ruby-on-rails ruby-on-rails-4 activerecord