【问题标题】:ruby on rails associations - removing something which doesn't exist in the associationruby on rails 关联 - 删除关联中不存在的内容
【发布时间】:2011-06-16 02:18:10
【问题描述】:

所以我有一个模型 foo,它有_and_belongs_to_many bar。

foo.bar 给了我所有与 foo 相关的栏。每次我删除一个 bar 时,我都会通过 :after_remove 回调调用 Foo.decrement_counter(:bar_count, self[:id]) 。

我正在测试删除与 foo 无关的栏。这也减少了计数器......这是我不想要的。如何确保仅在实际从关联中删除条时才减少计数器?

has_and_belongs_to_many :bar, :after_remove => :dec_bar_count, :after_add => :inc_bar_count, :uniq => true

def dec_bar_count(record)
  Foo.decrement_counter(:bar_count, self[:id])
end

谢谢。

【问题讨论】:

  • 能否发布您用于after_remove 回调的完整代码?
  • 我已经用代码更新了问题。

标签: ruby-on-rails callback associations counter


【解决方案1】:

为什么不直接使用Foo.bar.count

也许我误解了您在计数的内容,但您似乎在尝试复制 ActiveRecord 中已有的计数功能。

This question 也可能与 Rails 中的数据库缓存有关。

【讨论】:

  • 我想将计数存储在数据库中,这样我就不必每次想检索计数时都计算 Foo.bar.count,因为我希望获得关联的大小很大。此外,使用 Foo.bar.count 不是并发友好的,因为它首先 SELECT COUNT(*) 然后更新计数器列。
  • Rails 会为您缓存数据库工作,因此不会每次都重新计算。它缓存计数的答案,如果添加/删除记录(在任何线程中),它将被标记为“脏”,只重新计算一次,然后再次缓存直到它改变。换句话说,Rails 设计者想到了这一点,而 ActiveRecord 会自动执行此操作。
猜你喜欢
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多