【问题标题】:ActiveRecord::Persistence#update ignoring one attributeActiveRecord::Persistence#update 忽略一个属性
【发布时间】: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.rbt.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


【解决方案1】:

仔细检查以确保您没有使用任何回调...before_save 或类似的回调可能将其设置为原始值,您将看不到该消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 2017-03-03
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多