私Link
は多くのヒット作を持つモデルを持っています。私がやろうとしているのは、データベース テーブルから 1 時間あたりのヒット数に関するデータをhits
集計するyear
ことmonth
です。day
hour
すべてが正常に機能していますが、以下のコードを実行すると、データベースで約 1,000 のクエリが発生し、かなり過剰に思えます。
#before iteration
@hits = @link.hits.group('year, month, day, hour')
.order('year ASC, month ASC, day ASC, hour ASC')
.select('year, month, day, hour, count(*) as hits')
#inside iteration
#Line breaks are included here for easy reading
hits_per_hour =
@hits.where(
:year => t.year,
:month => t.month,
:day => t.day,
:hour => t.hour
).map(&:hits).first || 0
これは、リンクが最初にヒットしてから 1 時間ごとに反復t
するオブジェクトです。Time
レールは毎回再クエリするのではなく、クエリ結果を保存すると思います。また、クエリ結果のキャッシュなどについても何も見つけることができませんでした。私は何かを完全に見逃しているだけですか、それともこれが本当に最も簡単な方法ですか?
これは、クエリがどのように見えるかのサンプルです (これは、私のログに 1,000 個のブロックで表示されるものです)。
SELECT year, month, day, hour, count(*) as hits
FROM `hits`
WHERE
`hits`.`link_id` = 1 AND
`hits`.`year` = 2012 AND
`hits`.`month` = 11 AND
`hits`.`day` = 2 AND
`hits`.`hour` = 14
GROUP BY year, month, day, hour
ORDER BY year ASC, month ASC, day ASC, hour ASC