我有一个简单的关系:
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(使用前将#替换为@)