如何在count列上的某些条件下在Rails中使用counter_cache

时间:2011-08-03 19:25:47

标签: ruby-on-rails counter-cache

我这里有一些代码

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

     ......

现在,我想为成员添加一个counter_cache。由于条件架构,我不能   在成员资格而不是成员上添加counter_cache。但是班级人员不属于_to   团体,它拥有很多会员资格和会员资格属于团体。我应该在哪里添加   :counter_cache架构?

或如何实现要求:为成员资格添加counter_cache

THX

2 个答案:

答案 0 :(得分: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

您还应该在销毁成员资格时创建计数器缓存。但我认为我输入的内容足以让你实现它。

答案 1 :(得分: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