我有这个问题:
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执行查询,然后在内存中搜索?
或者我是否需要先将缺席存储为数组或哈希?
答案 0 :(得分:0)
您可以进行的一项SQL优化是:
变化:
absences.where('user_id = ?', user.id).first.hours
为:
absences.detect { |u| u.user_id == user.id }.hours
此外,您可能不需要遍历company.users。根据业务需求,您可以循环使用缺席。