我有一个名为Awardunit的模型。Awardunit有许多Awardleaders。一个奖励单位可以有一个或多个奖励负责人。
如果我获取所有记录或搜索,并将记录集合获取到名为awardunits的变量中,我如何计算该集合中所有单位中Awardleaders的数目?
以下是我所做的:

 @leaders = 0
 @awardunits.each do |unit|
      @leaders = @leaders + unit.awardleaders.size
 end

再次计算残疾领导人,我用这个:
  @disabledleaders = 0
  @awardunits.each do |unit|
     @disabledleaders = @disabledleaders + unit.awardleaders.where(disabled: true).size
  end

如果我使用它,每次加载页面时,它都必须遍历所有记录。有没有更好的方法来做这个?

最佳答案

通过添加计数器缓存,可以降低计算关联的成本:

class AwardUnit << ActiveRecord::Base
  has_many :award_units
end

class AwardLeader << ActiveRecord::Base
  belongs_to :award_unit, counter_cache: true
end

现在,在新的迁移中将名为award_leaders_count的新列添加到AwardUnit表中:
  def change
    add_column :award_units, :award_leaders_count, :integer, default: 0

    AwardUnit.all.each do |unit|
      AwardUnit.reset_counters(unit.id, :award_leaders)
    end
  end

rails现在将自动缓存每个AwardUnit的award_leaders的数量,并且@my_award_unit.award_leaders.count将在不运行另一个数据库查询的情况下为您提供计数。
默认情况下,railscounter_cache只适用于所有获奖者。如果您只需要计算那些有条件的获奖领导人,则必须添加自己的计数器缓存:
class AwardUnit << ActiveRecord::Base
  has_many :award_units
end

class AwardLeader << ActiveRecord::Base
  belongs_to :award_unit

  scope :disabled, -> { where(disabled: true) }

  after_save :update_counter_cache
  after_destroy :update_counter_cache

  def update_counter_cache
    award_unit.update_attribute(:disabled_award_units_count, award_unit.award_leaders.disabled.count)
  end
end

迁移:
  def change
    add_column :award_units, :disabled_award_leaders_count, :integer, default: 0

    AwardUnit.all.each do |unit|
      unit.update_attribute(:disabled_award_units_count, unit.award_leaders.disabled.count)
    end
  end

现在,当你有一个AwardUnits数组时,得到他们的残疾奖领奖人的总数就简单到
@award_units = AwardUnit.limit(5).to_a # or a similar query
@award_units.inject(0){|sum,unit| sum + unit.disabled_award_leaders_count }

关于ruby-on-rails - 在Rails中,如何计算集合中关联记录的数量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20653999/

10-09 00:34