6

私は2種類のモデル、コメントと返信を持つアプリを持っています。それぞれ、あなたは「同意」または「同意できない」のいずれかを選択できるので、Emotionという多形モデルがあります。ここではこれらのための私のコードは次のとおりです。多態性の関係とカウンタキャッシュ

class Comment < ActiveRecord::Base 
    belongs_to :user 
    has_many :replies 
    has_many :emotions, :as => :emotionable 
end 



class Reply < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :comment 
    has_many :emotions, :as => :emotionable 
end 

class Emotion < ActiveRecord::Base 
    belongs_to :emotionable, :polymorphic => :true 
end 

だから、これはすべてが正常に動作しますが、私はそれぞれの同意や不同意のサイズを取得するために、コメントや返信の両方のためのカウンターキャッシュを追加する必要がありますするつもりですオブジェクト。すべてのドキュメントでは、通常の多態的な関連付けを持つカウンタキャッシュを実行するための例がありますが、それには余分な条件がありません。参考までに、感情のスキーマで次のようになります。

create_table "emotions", :force => true do |t| 
    t.integer "user_id" 
    t.string "emotion" 
    t.integer "emotionable_id" 
    t.string "emotionable_type" 
    t.datetime "created_at",  :null => false 
    t.datetime "updated_at",  :null => false 
end 

TL:DR - 私は上のreply.agrees_countとする@ reply.disagrees_count @、comment.disagrees_count @、commet.agrees_count @呼び出すことができるようにする必要がありますカウンタキャッシュを介した多相関連。したがって、コメントと返信には2つのカウンタキャッシュが必要です。

答えて

3

私は、レコードが永続化され、トランザクション外で更新されるかどうかをテストできるように、after_commitコールバックでカウンタキャッシュを手動で増減することをお勧めします。これは、コードがより明示的になり、キャッシュがいつ、どのように更新され、無効にされるかについて不明確になるからです。

また、キャッシュを手動で更新すると、たとえば、カルマシステムなどのコメントに同意または異議を唱えるときに、より多くの権限を付与したい場合など、さらに柔軟に対応できます。

4

関連するクラス(例:クラスPost; attr_readonly:comments_count; end)のattr_readonlyリストにカウンタキャッシュ属性を追加することができます。 http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/belongs_to

:polymorphic 

    Specify this association is a polymorphic association by passing true. 
    Note: If you’ve enabled the counter cache, then you may 
    want to add the counter cache attribute to the attr_readonly list in 
    the associated classes 
    (e.g. class Post; attr_readonly :comments_count; end). 
+0

まだそれは私のために働かなかった – kamal

1

class Code < ActiveRecord::Base 
    has_many :notes, :as => :noteable 
end 

class Issue < ActiveRecord::Base 
    has_many :notes, :as => :noteable 
end 

class Note < ActiveRecord::Base 
    belongs_to :noteable, polymorphic: true, count_cache: :noteable_count 
end 

'ポリモーフィック関係とカウンターキャッシュ' のためには、それはおよそMultiple counter_cache in Rails model

ところでだ、 'ポリモーフィック関係とカウンタキャッシュ' のどれもビジネスですあなたのテーブルの 'issue'には、テーブル 'codes'と同じ 'noteable_count'という列が必要です

関連する問題