我有一个名为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
将在不运行另一个数据库查询的情况下为您提供计数。默认情况下,rails
counter_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
现在,当你有一个
AwardUnit
s数组时,得到他们的残疾奖领奖人的总数就简单到@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/