【发布时间】:2019-04-15 10:21:41
【问题描述】:
我有一个 ActiveRecord 模型(使用 STI)MonetaryChange::PaymentPromise,它具有 subtotal_cents 作为属性/列(整数)。
我的控制器正在更新该模型/属性,但由于某种原因,当我调用 map 时,我得到了旧的/原始值,而当我调用 pluck 时,我得到了更新的(正确的)值。例如:
V410MonetaryChange::PaymentPromise.where(id: 1).pluck(:subtotal_cents)
=> [24600] # this is the correct updated value
V410MonetaryChange::PaymentPromise.where(id: 1).map(&:subtotal_cents)
=> [12300] # this is the original value, but it should have been updated to 24600
我注意到 Rails 为 pluck 方法生成的 SQL 要简单得多:
(0.5ms) SELECT "v410_monetary_changes"."subtotal_cents"
FROM "v410_monetary_changes"
WHERE "v410_monetary_changes"."type" IN ('V410MonetaryChange::PaymentPromise')
AND "v410_monetary_changes"."deleted_at" IS NULL
AND "v410_monetary_changes"."id" = $1 [["id", 1]]
但map 方法的 SQL 在第一次查询后会加载一大堆关联:
V410MonetaryChange::PaymentPromise Load (0.6ms) SELECT "v410_monetary_changes".* FROM "v410_monetary_changes" WHERE "v410_monetary_changes"."type" IN ('V410MonetaryChange::PaymentPromise') AND "v410_monetary_changes"."deleted_at" IS NULL AND "v410_monetary_changes"."id" = $1 [["id", 1]]
V410OrderedSku Load (0.3ms) SELECT "v410_ordered_skus".* FROM "v410_ordered_skus" WHERE "v410_ordered_skus"."deleted_at" IS NULL AND "v410_ordered_skus"."id" = $1 LIMIT 1 [["id", 1]]
V410OrderedSkusV410Sku Load (0.2ms) SELECT "v410_ordered_skus_v410_skus".* FROM "v410_ordered_skus_v410_skus" WHERE "v410_ordered_skus_v410_skus"."v410_ordered_sku_id" = $1 LIMIT 1 [["v410_ordered_sku_id", 1]]
V410Sku Load (0.2ms) SELECT "v410_skus".* FROM "v410_skus" WHERE "v410_skus"."id" = $1 LIMIT 1 [["id", 1]]
知道为什么会这样,我该如何解决?
我尝试在查询中添加.reload,但结果相同:
V410MonetaryChange::PaymentPromise.where(id: 1).reload.map(&:subtotal_cents)
=> [12300]
编辑 1:
我可以确认数据库具有正确的值(24600)。当我打开psql 控制台并运行查询时:
SELECT "v410_monetary_changes"."subtotal_cents"
FROM "v410_monetary_changes"
WHERE "v410_monetary_changes"."type" IN ('V410MonetaryChange::PaymentPromise')
AND "v410_monetary_changes"."deleted_at" IS NULL
AND "v410_monetary_changes"."id" = 1;
我明白了:
subtotal_cents
----------------
24600
(1 row)
因此,Rails 一定是对关联进行了处理,导致它向我提供了旧版本的记录。任何想法为什么?
【问题讨论】:
-
应该是一样的。尝试重新启动您的 Rails 控制台。
-
@EvanG - 是的,我也想过。可悲的是,重新启动控制台没有任何改变!
-
您是否覆盖了模型中的
subtotal_cents? -
@MarcinKołodziej 我在父模型中有另外两个
subtotal_cents方法,但在我查询的模型中没有。
标签: ruby-on-rails ruby-on-rails-4 activerecord