ruby-on-rails - Rails 不回滚也不更新属性
问题描述
在终端中(稍后我需要将其添加到迁移中)我想更新total_campaign_codes_amount
代表每个信用活动的所有活动代码。这个字段是一个 counter_cache 并且在终端中这样做我有这个脚本:
CreditCampaign.all.each do |cc|
cc.update!(
total_campaign_codes_amount: cc.campaign_codes.count
)
end
我在我的 sql 中没有收到任何错误,一切都应该工作,但这些值没有保存到 -total_campaign_codes_amount
每个 CreditCampaign 显示 0。
CreditCampaign Update (0.2ms) UPDATE "credit_campaigns" SET "updated_at" = $1 WHERE "credit_campaigns"."id" = $2 [["updated_at", "2019-10-14 15:26:54.010779"], ["id", 1]]
(0.4ms) COMMIT
(0.2ms) SELECT COUNT(*) FROM "campaign_codes" WHERE "campaign_codes"."credit_campaign_id" = $1 [["credit_campaign_id", 2]]
(0.1ms) BEGIN
CreditCampaign Update (0.2ms) UPDATE "credit_campaigns" SET "updated_at" = $1 WHERE "credit_campaigns"."id" = $2 [["updated_at", "2019-10-14 15:26:54.013239"], ["id", 2]]
(0.2ms) COMMIT
=> [#<CreditCampaign id: 1, amount: 0.25e3, interest_rate: 0.12e2, installment_amount: 0.1e3, duration_in_months: 24, start_date: "2019-10-10", end_date: "2019-11-10", created_at: "2019-10-10 14:54:27", updated_at: "2019-10-14 15:26:54", name: "Credit Campaign #1", total_campaign_codes_amount: 15, used_campaign_codes_amount: 6>, #<CreditCampaign id: 2, amount: 0.1e1, interest_rate: 0.1e1, installment_amount: 0.1e1, duration_in_months: 1, start_date: "2011-01-01", end_date: "2020-01-01", created_at: "2019-10-14 13:40:02", updated_at: "2019-10-14 15:26:54", name: "test", total_campaign_codes_amount: 10, used_campaign_codes_amount: 0>]
我试图使用update_attributes!
代替update!
和find_each
代替all.each
但没有任何结果。
解决方案
您不能在 Rails 中更新计数器缓存列,因为它是通过 .添加到包含模型的只读属性列表中的attr_readonly
。相反,您应该使用update_counters
or reset_counters
。
推荐阅读
- fortran - ifort 是否支持 mac 上的 coarrays
- scala - 是否有一种简单而通用的方法可以将 scala 对象的代码与要在对象主体代码之前和之后执行的代码一起包装?
- python - 如何在包含字典、整数、浮点数和字符串的列表中找到项目的类型?
- list - 如何根据一些相似的属性分离相似的元组?
- java - 创建卡片组 - 可能更有效地设置值?
- python-3.x - Mnist Digit Recogniser 在自己的手写数字上运行时给出错误答案。为什么?
- c++ - 检查windows10是否安装了C++
- vulkan - 可以在没有信号量或栅栏的情况下同步获取和写入交换链图像吗?
- spring - java.lang.ClassNotFoundException: sun.misc.BASE64Encoder
- android-ndk - Android Studio原生库构建——Mac上的NDK clang权限问题