0

次のコードが実行の背後にあるプロセッサにひどいドレインを引き起こす可能性があるかどうかをここで誰かが知っているrake testでしょうか?

  def calc_yesterday_count
    self.jobs.select{|a| a.completed_on > Time.zone.now.yesterday.beginning_of_day && a.completed_on < Time.zone.now.yesterday.end_of_day if a.completed_on != nil}.length
  end

  def calc_yesterday_sum
    self.jobs.select{|a| a.completed_on > Time.zone.now.yesterday.beginning_of_day && a.completed_on < Time.zone.now.yesterday.end_of_day if a.completed_on != nil}.map(&:total).sum
  end

  def calc_today_count
    self.jobs.select{|a| a.completed_on > Time.zone.now.beginning_of_day && a.completed_on < Time.zone.now.end_of_day if a.completed_on != nil}.length
  end

  def calc_today_sum
    self.jobs.select{|a| a.completed_on > Time.zone.now.beginning_of_day && a.completed_on < Time.zone.now.end_of_day if a.completed_on != nil}.map(&:total).sum
  end

  def calc_week_count
    self.jobs.select{|a| a.completed_on > Time.zone.now.beginning_of_week && a.completed_on < Time.zone.now.end_of_week if a.completed_on != nil}.length
  end

  def calc_week_sum
    self.jobs.select{|a| a.completed_on > Time.zone.now.beginning_of_week && a.completed_on < Time.zone.now.end_of_week if a.completed_on != nil}.map(&:total).sum
  end

  def calc_month_count
    self.jobs.select{|a| a.completed_on > Time.zone.now.beginning_of_month && a.completed_on < Time.zone.now.end_of_month if a.completed_on != nil}.length
  end

  def calc_month_sum
    self.jobs.select{|a| a.completed_on > Time.zone.now.beginning_of_month && a.completed_on < Time.zone.now.end_of_month if a.completed_on != nil}.map(&:total).sum
  end

  def calc_year_count
    self.jobs.select{|a| a.completed_on > Time.zone.now.beginning_of_year && a.completed_on < Time.zone.now.end_of_year if a.completed_on != nil}.length
  end

  def calc_year_sum
    self.jobs.select{|a| a.completed_on > Time.zone.now.beginning_of_year && a.completed_on < Time.zone.now.end_of_year if a.completed_on != nil}.map(&:total).sum
  end

  def calc_open_estimates_sum
    self.jobs.uncompleted.select{|a|a.which != 'job'}.map(&:total).sum
  end

  def calc_jobs_in_progress_sum
    self.jobs.non_estimate.uncompleted.select{|a| a.scheduled_on < Time.zone.now if a.scheduled_on != nil}.map(&:total).sum
  end

alias :account_stats_method :account_stats


    #lazy build account stats
def build_account_stats
  @estimates_in_progress = self.jobs.completed.select{|a|a.which != 'job'}.map(&:total).sum
  @jobs_in_progress      = self.jobs.non_estimate.uncompleted.select{|a| a.scheduled_on < Time.zone.now if a.scheduled_on != nil}.map(&:total).sum
  @account_stats = {
    :account_id         => self.id,
    :yesterday_count    => self.calc_yesterday_count,
    :yesterday_total    => self.calc_yesterday_sum,
    :today_count        => self.calc_today_count,
    :today_total        => self.calc_today_sum,
    :week_count         => self.calc_week_count,
    :week_total         => self.calc_week_sum,
    :month_count        => self.calc_month_count,
    :month_total        => self.calc_month_sum,
    :year_count         => self.calc_year_count,
    :year_total         => self.calc_year_sum
  }
  self.create_account_stats(@account_stats)
end

def account_stats
  if account_stats_method.nil?
    build_account_stats
  else
    account_stats_method
  end
end
4

1 に答える 1

1

何が起こっているのかを確認するのはまだ少し難しいですが、self.jobsはActiveRecordの関連付けに基づいていると思います。使用する場合self.jobs.select { ... }は、データベースからすべてのジョブをロードしてから、それらすべてを反復処理して、どのジョブを引き出すかを判断します。そこでデータベースクエリを使用して、必要なレコードを選択することをお勧めします。Rails 3を使用していると仮定すると、に変更selectするのが正しい方向です。Rails2を使用している場合は、これをに変更する必要があります。where:conditions

self.jobs.where('completed_on > ? AND completed_on < ? AND completed_on IS NOT NULL' , Time.zone.now.beginning_of_day, Time.zone.now.end_of_day).map(&:total).sum
于 2012-04-26T17:59:50.427 に答える