gpt4 book ai didi

ruby-on-rails - 更新模型时如何更新counter_cache?

转载 作者:行者123 更新时间:2023-12-03 16:11:56 25 4
gpt4 key购买 nike

我有一个简单的关系:

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

class Container
has_many :items
end

假设我有两个容器。我创建一个项目并将其与第一个容器相关联。计数器增加。

然后,我决定将其与另一个容器关联。如何更新两个容器的items_count列?

我在 http://railsforum.com/viewtopic.php?id=39285找到了一个可能的解决方案..但是我是一个初学者,我不理解。这是唯一的方法吗?

最佳答案

它应该自动工作。当您更新items.container_id时,它将删除旧容器的计数器,而删除新容器的计数器。但是,如果它不起作用,那就很奇怪了。您可以尝试以下回调:

class Item
belongs_to :container, :counter_cache => true
before_save :update_counters

private
def update_counters
new_container = Container.find self.container_id
old_container = Container.find self.container_id_was
new_container.increament(:items_count)
old_container.decreament(:items_count)
end
end

UPD

演示 native 行为:
container1 = Container.create :title => "container 1"
#=> #<Container title: "container 1", :items_count: nil>
container2 = Container.create :title => "container 2"
#=> #<Container title: "container 2", :items_count: nil>
item = container1.items.create(:title => "item 1")
Container.first
#=> #<Container title: "container 1", :items_count: 1>
Container.last
#=> #<Container title: "container 1", :items_count: nil>
item.container = Container.last
item.save
Container.first
#=> #<Container title: "container 1", :items_count: 0>
Container.last
#=> #<Container title: "container 1", :items_count: 1>

因此它应该可以正常工作而不会受到任何黑客攻击。从盒子里。

关于ruby-on-rails - 更新模型时如何更新counter_cache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5758339/

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