7

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 を機能させるにはどうすればよいですか?

===更新===

次に例を示します。

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ですか?単一テーブルの継承に適用することは可能ですか?

4

2 に答える 2

11

同じ状況に直面しただけで、期待どおりに機能しました(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でテストしました!

于 2013-07-19T06:23:59.510 に答える
6

「: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
于 2010-10-22T20:44:31.183 に答える