7

我想知道 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

哪一个?我猜是第 3 个,但我还想要 4 个。如果不是 4,我如何使 4 起作用?

=== 更新 ===

这是一个例子:

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,是否可以应用于单表继承?

4

2 回答 2

11

刚刚遇到同样的情况,它对我有用,如你所料(数字 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

就是这样!每当您创建一个问题时,它都会增加正确的计数器。在rails 3.2上测试过!

于 2013-07-19T06:23:59.510 回答
6

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

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
于 2010-10-22T20:44:31.183 回答