我想知道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
questions_count
工作simple_questions_count
和complex_questions_count
哪一个?我猜第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
的基本行为是什么,是否可以应用于单表继承?
答案 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_count
和simple_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