gpt4 book ai didi

ruby-on-rails - counter_cache 保存后不在模型上更新

转载 作者:行者123 更新时间:2023-12-01 12:49:33 24 4
gpt4 key购买 nike

我正在使用 counter_cache 让 MySQL 为我做一些簿记工作:

class Container
has_many :items
end

class Item
belongs_to :container, :counter_cache => true
end

现在,如果我这样做:

container = Container.find(57)
item = Item.new
item.container = container
item.save

在 SQL 日志中将有一个 INSERT 后跟如下内容:

UPDATE `containers` SET `items_count` = COALESCE(`items_count`, 0) + 1
WHERE `containers`.`id` = 57

这正是我所期望的。但是,container[:items_count] 会过时!

...除非我 container.reload 获取更新后的值。在我看来,这在某种程度上违背了使用 :counter_cache 以支持自定义构建的目的的一部分,特别是因为在我尝试访问 items_count 之前我可能实际上并不想要 reload 属性。 (由于域逻辑的性质,我的模型代码量很大,所以有时我必须在一个 Controller 调用中保存和创建多个东西。)

我知道我可以自己修改回调,但在我看来,这是对简单功能的相当基本的期望。同样,如果我必须编写额外的代码才能使其完全正常工作,那么实现自定义计数器可能会更容易一些。

我在做什么/假设错了什么?

最佳答案

您不应期望项目计数器的值会在您的 Container 实例中自动更新。请记住,大多数 Rails 应用程序在多进程(通常是多服务器)配置中运行。如果一个进程在另一个进程上添加与 Container 实例关联的 Item,则计数器的值将变得陈旧。

关于ruby-on-rails - counter_cache 保存后不在模型上更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13546534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com