Webuilder240

弱小Railsアプリケーションで1日毎のお手軽な集計方法のご提案

2018-02-05 17:30:00 +0900

こちらのアンサーブログだと思ってもらえれば。

webuilder240.hatenablog.com

結論

結論からいうと、集計をするための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が取り出しやすい用に)という用途でも利用できそうなので、便利な感じはする。 ただ筋悪なのは否めないので、もっといい方法があれば教えていただきたい所存です。

関連しそうなブログ