ActiveRecord查询性能,执行初始查询后执行的位置

时间:2015-09-24 23:08:22

标签: ruby-on-rails

我有这个问题:

absences = Absence.joins(:user).where('users.company_id = ?', @company.id).where('"from" <= ? and "to" >= ?', self.date, self.date).group('user_id').select('user_id, sum(hours) as hours')

这将返回user_id的总时数。

现在我需要遍历公司的所有用户并进行一些计算。

company.users.each do |user|
    tc = TimeCheck.find_or_initialize_by(:user_id => user.id, :date => self.date)
    tc.expected_hours = user.working_hours - absences.where('user_id = ?', user.id).first.hours
end

出于性能原因,我想只对缺席表(第一个)进行一次查询,然后在内存中查找正确的用户。我怎样才能做到最好?我相信默认情况下,缺席将是ActiveRecord :: Relation而不是结果集。是否有一个命令可用于指示activerecord执行查询,然后在内存中搜索?

或者我是否需要先将缺席存储为数组或哈希?

1 个答案:

答案 0 :(得分:0)

您可以进行的一项SQL优化是:

变化:

absences.where('user_id = ?', user.id).first.hours

为:

absences.detect { |u| u.user_id == user.id }.hours

此外,您可能不需要遍历company.users。根据业务需求,您可以循环使用缺席。