ActiveRecord::Persistence#update 忽略一个属性
ActiveRecord::Persistence#update ignoring one attribute
我正在尝试更新我的 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 的评论。尝试直接更新 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 设置回原始值。
仔细检查以确保您没有使用任何回调...before_save
或类似的回调 可能 将其设置为原始值,而您不会看到该消息。
我正在尝试更新我的 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 的评论。尝试直接更新 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 设置回原始值。
仔细检查以确保您没有使用任何回调...before_save
或类似的回调 可能 将其设置为原始值,而您不会看到该消息。