弱小Railsアプリケーションで1日毎のお手軽な集計方法のご提案
こちらのアンサーブログだと思ってもらえれば。
結論
結論からいうと、集計をするためのModelを作っておいてそこから集計を行う方式にして、 色々なModelの集計に対して対応できるようにした。
create_table "aggregaters", force: :cascade do |t|
t.date "aggregate_date", null: false
t.string "aggregate_type", limit: 255
t.float "aggregate_value", null: false
end
ちょっと筋悪な感も否めないが、なにもしないよりは良いだろうと思っている。 タスクにして実行しないといけないのは当然なんだけど、そもそも弱小アプリケーションなんだから問題ないだろうと思ってる。
簡単な利用方法
バッチで結果を格納する側 (RailsのRakeタスク)
require 'active_record'
require 'active_support'
namespace :aggregate_record do
desc 'コメント数の集計を行って、集計レコードを作成します。'
task create_daily_comment: :environment do
Aggregater.create(aggregate_date: Date.now, aggregate_type: 'comment_count', aggregate_value: Comment.size)
end
end
呼び出し方
# なんかここはうまいことやるのは解るけど、あくまで簡単なサンプルで。
daily_comment_count_obj = Aggregater.find_by(aggregate_date: Date.yesterday, aggregate_type: 'comment_count')
daily_comment_count = daily_comment_count_obj.aggregate_value || 0
今後
弱小な間はしばらくはこの方式でなんとかなりそう。 今後もTresureDataやBigQuery等を利用した集計を行う為の外部サービスのクエリ結果をDBにキャッシュする(格納してRailsが取り出しやすい用に)という用途でも利用できそうなので、便利な感じはする。 ただ筋悪なのは否めないので、もっといい方法があれば教えていただきたい所存です。