更新模型时如何更新counter_cache?

2024-02-28

我有一个简单的关系:

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

class Container
  has_many :items
end

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

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

我找到了一个可能的解决方案http://railsforum.com/viewtopic.php?id=39285 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

演示本机行为:

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>

所以它应该可以在没有任何黑客攻击的情况下工作。从盒子里。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新模型时如何更新counter_cache? 的相关文章

随机推荐