弱小Railsアプリケーションで1日毎のお手軽な集計方法のご提案
2018-02-05 17:30:00 +0900
こちらのアンサーブログだと思ってもらえれば。
結論
結論からいうと、集計をするための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が取り出しやすい用に)という用途でも利用できそうなので、便利な感じはする。 ただ筋悪なのは否めないので、もっといい方法があれば教えていただきたい所存です。