单表继承中的counter_cache

时间:2010-10-20 16:44:33

标签: ruby-on-rails ruby-on-rails-3 has-many single-table-inheritance counter-cache

我想知道counter_cache是​​否可以在单表继承中工作。

对于这些模型:

class User
  has_many :questions
end

class Question
  belongs_to :user, :counter_cache => true
end

class SimpleQuestion < Question
end
class ComplexQuestion < Question
end

以下计数器也会起作用吗?

create_table(:users) do |t|
  t.integer :questions_count
  t.integer :simple_questions_count
  t.integer :complex_questions_count
end
  1. 所有这些都有效
  2. 他们都没有工作
  3. questions_count工作
  4. simple_questions_countcomplex_questions_count
  5. 哪一个?我猜第3次,但我还想要4次。如果它不是4,我该如何使4工作?

    === UPDATE ===

    以下是一个例子:

    id, user_id, question_content, type
    1, 3, something, SimpleQuestion
    2, 3, something, SimpleQuestion
    3, 3, something, ComplexQuestion
    

    所以我现在想要:

    user.questions_count # => 3
    user.simple_questions_count # => 2
    user.complex_questions_count # => 1
    

    我的问题是,:counter_cache => true的基本行为是什么,是否可以应用于单表继承?

2 个答案:

答案 0 :(得分:10)

面对同样的情况,它对你有用(正如你所料)(第4号):

看,修改你的代码,这样子类就会覆盖父行为:

class User
  has_many :questions
end

class Question
  belongs_to :user
end

class SimpleQuestion < Question
  belongs_to :user, :counter_cache => true
end
class ComplexQuestion < Question
  belongs_to :user, :counter_cache => true
end

并将complex_questions_countsimple_questions_count列添加到User

多数民众赞成!每当你创建一个问题时,它会增加正确的计数器。在轨道3.2上测试了它!

答案 1 :(得分:4)

查看实现“:counter_cache”的源代码,看起来它不支持您需要的计数。幸运的是,很容易在这里推出自己的。只需更新问题即可手动跟踪计数,如下所示:

class Question
  belongs_to :user

  after_create :increment_counts
  before_destroy :decrement_counts

  protected

  def increment_counts
    User.increment_counter :questions_count, user_id
    User.increment_counter "#{type.pluralize.underscore}_count", user_id
  end

  def decrement_counts
    User.decrement_counter :questions_count, user_id
    User.decrement_counter "#{type.pluralize.underscore}_count", user_id
  end
end