質問

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つの仕事をすることができますか?

=== 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_countsimple_questions_count あなたへの列 User

それでおしまい!質問を作成するたびに、適切なカウンターが増加します。 Rails 3.2でテストしました!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top