1

ここにいくつかのコードがあります

class group < ActiveRecord::Base 
    has_many :memberships, :dependent => :destroy         
    has_many :members, :through => :memberships,  :source => :person
                       :conditions => ['memberships.pending = ? ', false]

     ......

今、メンバーに counter_cache を追加したいと思います。条件スキーマのため、メンバーではなくメンバーシップに counter_cache を追加できません。しかし、個人クラスはグループに属していません。多くのメンバーシップがあり、メンバーシップはグループに属しています。:counter_cache スキーマはどこに追加すればよいですか?

または、要件をどのように実装できますか:メンバーシップに counter_cache を追加します

どうも

4

2 に答える 2

0

@Ramon Tayag の回答に基づいて、独自の条件がある場合に独自のカウンター キャッシュを実装するより良い方法は、次のincrement_counterメソッドを使用することです。

class Membership < ActiveRecord::Base
  after_create :increment_group_pending_counter_cache

  private

  def increment_group_pending_counter_cache
    if self.pending
      Group.increment_counter :pending_member_counter, group_id
    end
  end
end

Group は、「pending_member_counter」という名前の列を持つモデル クラスであり、Membership モデルには、それを Group モデルに関連付ける group_id 列があります。

完全なドキュメント: http://apidock.com/rails/ActiveRecord/CounterCache/increment_counter

于 2012-08-09T00:27:17.523 に答える
0

その場合、おそらく独自のキャッシュカウンターを実装する必要があります。

class Membership < ActiveRecord::Base
  after_create :increment_group_pending_counter_cache

  private

  def increment_group_pending_counter_cache
    if self.pending
      # let's say the column in the groups table is called `pending_member_counter`
      self.group.update_attribute :pending_member_counter, group.pending_member_counter + 1
    end
  end
end

メンバーシップが破棄されたときのカウンター キャッシュも作成する必要があります。しかし、私はあなたがそれを実装するのに十分なほど入力したと思います.

于 2011-08-23T14:09:58.487 に答える