単一テーブル継承の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
- それらはすべて機能します
- それらのどれも機能しません
- それだけ
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
そして、単一テーブルの継承に適用することは可能ですか?
解決
「: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
他のヒント
同じ状況に直面したばかりで、あなたが予想したように私のために働きました(Num 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
それでおしまい!質問を作成するたびに、適切なカウンターが増加します。 Rails 3.2でテストしました!
所属していません StackOverflow