◯◯なユーザーのリストが欲しい、といった類の要望をお客さんにもらうことがあります。SQLでデータを引っ張ってくればリストを作れるものの、本番DBに繋いでSQL投げて出てきたものを渡す、ってことを考えると大変です。いずれ見たい情報が増えることを考えるとWeb側にそれ用の画面を用意するのは現実的ではありません。
そこで登場するのが今回取り上げたBlazerというgemです。BlazerはRailsのmountable engineの仕組みで自分のRailsアプリにBlazerの画面を簡単にマウントできるようになっています。Blazerの画面でSQLを書いて実行し、保存しておくことができます。保存済のクエリの画面へ行くと、現在のDBからそのクエリで情報を取り出して一覧にしてくれ、CSVダウンロードも可能です。
さらにBlazerは↓な感じでチャートを表示することもできるらしい。まだ使いこなせてないですが、かっこいいです。
(ちなみに、同様の機能を提供するAdhoqというgemもあります。こちらは日本の永和システムマネジメントさん中心に開発されています)
最低限の導入
ローカルで最低限動くようにするために必要なのはたった3ステップです。
gem追加
Gemfileにgem 'blazer'
を追記して、
$ bundle install
インストール
$ rails g blazer:install
$ rake db:migrate
routes.rb更新
mount Blazer::Engine, at: "blazer"
これでlocalhost:3000/blazer
でBlazerのダッシュボードにアクセスできるようになります。 blazer_path
というURLヘルパーも使えるようになります。
ちなみにBlazer公式のDemoサイトがこちらです。
ここでは実際にクエリを発行して試せるはず。気になったら触ってみるといいと思います。
認証をつける
ベーシック認証、Deviseのresourceを使った認証といった簡易に設定できる認証があります。今回のRailsアプリの場合はDeviseにUserモデルとAdministratorモデルがあるなどして、簡易な方法ではうまく動かなかったこともあって、before_action
を利用する方法を採りました。
READMEのこの部分に該当します。
ankane/blazer: Business intelligence made simple
blazer.yml
内のuser_class
, user_method
, before_action
を次のように書き換えました。
user_class: Administrator
user_method: current_administrator
before_action: :authenticate_blazer_user!
user_class
はBlazerの画面のユーザーとなるモデルのクラス、ここではAdministrator
を指定しました。user_method
はそのユーザーを返すメソッドで、ここではDeviseのcurrent_administrator
ヘルパーメソッドを指定します。
最後のbefore_action
が認証の本体で、メソッドのシンボルを指定します。これをapplication_controller.rb
に書きます。current_administratorがいなければリダイレクトするよ、となってます。これで管理者として正しく認証できていないときにはリダイレクトされる(=使えない)ことになります。
def authenticate_blazer_user!
redirect_to root_url unless current_administrator
end
本番で使う
READMEのこの部分が該当します。
ankane/blazer: Business intelligence made simple
読み取り権限のみの専用ユーザーを作って使おう、という話です。ここでユーザーを作ったら、本番環境のBLAZER_DATABASE_URL
にDBのURLをユーザー名、パスワード付で指定します。
僕の場合はpostgresqlだったのでこんな感じになります。
postgres://blazer:your-password@your-db-host-name/your-db-name
おわり
これで、お客さんに〇〇データが欲しい、と言われたときに簡単にデータを抽出できるわけです。こないだ勉強したSQLが火を吹きますね。
ダッシュボード機能とチャートについては今度書こう。