首页 > 解决方案 > 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但没有任何结果。

标签: ruby-on-railsruby

解决方案


您不能在 Rails 中更新计数器缓存列,因为它是通过 .添加到包含模型的只读属性列表中的attr_readonly。相反,您应该使用update_countersor reset_counters


推荐阅读