1

この方法をより効率的にする方法はありますか?多数のトランザクションをクエリしていますが、期間ごとに個別のactiverecordクエリを実行するのは非効率的です。

1日中、1つのクエリを実行し、結果を期間別にグループ化して並べ替える必要がありますか?もしそうなら、これを行うための最も効率的な方法は何ですか?あなたの考えを楽しみにしています。

def self.transactions(period)
  today = Date.today
  time1 = Time.utc(today.year, today.month, today.day, 9, 30, 0)
  time2 = Time.utc(today.year, today.month, today.day, 16, 0, 0)
  transactions_by_period = {}

  while time1 < time2
    transactions = self.where("created_at >= ? and created_at <= ?", time1, time2)
    transactions_by_period[time1] = transactions
    time1 += period
  end

return transactions_by_period
end

#todays_transactions_by_hour = Stock.transactions(1.hour)
4

1 に答える 1

2

まず、範囲を使用してより適切なクエリを実行できます。また、名前time1を and time2to startandに変更しますfinish

transactions = self.where(:created_at => start..finish)

次に、これを減らして、期間ごとに取得できます。

transactions.reduce(Hash.new{|h, k| h[k] = []) do |periods, transaction|
  # Calculate how many periods have gone by for this transaction
  offset = (transaction.created_at - start).to_i / period
  # Find the actual period
  transaction_period = start + offset * period
  periods[transaction_period] << transaction
  periods
end

編集

私はコードをテストしていません、それはロジックのためにもっと示されています

于 2013-01-17T18:03:23.987 に答える