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)
questions_count工作simple_questions_count和complex_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_count和simple_questions_count列到您的User
而已!每当你创建一个问题时,它会增加正确的计数器.在轨道3.2上测试它!
查看实现 ":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)
| 归档时间: |
|
| 查看次数: |
1274 次 |
| 最近记录: |