单表继承中的counter_cache

Pet*_*ong 6 ruby-on-rails has-many single-table-inheritance counter-cache ruby-on-rails-3

我想知道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
Run Code Online (Sandbox Code Playgroud)

那么下面的计数器会起作用吗?

create_table(:users) do |t|
  t.integer :questions_count
  t.integer :simple_questions_count
  t.integer :complex_questions_count
end
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)

所以现在我想:

user.questions_count # => 3
user.simple_questions_count # => 2
user.complex_questions_count # => 1
Run Code Online (Sandbox Code Playgroud)

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

pri*_*kha 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
Run Code Online (Sandbox Code Playgroud)

并添加complex_questions_countsimple_questions_count列到您的User

而已!每当你创建一个问题时,它会增加正确的计数器.在轨道3.2上测试它!


Ben*_*Lee 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
Run Code Online (Sandbox Code Playgroud)