前提
データベースに格納された残高のデータを読みだして図表を描きたい。図表は JavaScript ライブラリを利用してゴリゴリ動く感じのグラフにする。このようなニーズがあったとします。
データの流れ : RDBMS → Ruby(Sinatra) → JSON → JavaScript
JavaScript にデータを渡したいといったシチュエーションはよくあると思われるのでメモ。
JSON API の実装
まずは Sinatra 側に GET したら JSON が返ってくる API を実装する。
参考 [Ruby]SinatraでJSONを返す
http://d.hatena.ne.jp/rightgo09_ruby/20130828/p1
get '/api/balance/show' do
if authorization # 認証に成功したか判定
@balances = Balance.where(uid: @user.uid) # データを DB から読み出す
# 配列に加工
labels = []
data = []
@balances.each do |balance|
labels.push(balance.month)
data.push(balance.data)
end
# sinatra/json を使ってもいいけど
content_type :json
{
type: 'bar',
data: {
labels: labels, # ラベルの配列をあてはめる
datasets: [{
label: "残高",
backgroundColor: "rgba(2,117,216,1)",
borderColor: "rgba(2,117,216,1)",
data: data, # 数値の配列をあてはめる
}],
},
options: {
scales: {
xAxes: [{
time: {
unit: 'month'
},
gridLines: {
display: false
},
ticks: {
maxTicksLimit: labels.count # ラベルの個数を渡す
}
}],
yAxes: [{
ticks: {
min: 0,
max: data.max, # データの最大値を渡す
maxTicksLimit: data.count # データの個数を渡す
},
gridLines: {
display: true
}
}],
},
legend: {
display: false
}
}
}.to_json # to_json で返せば JSON データを返却できる
end
end
こんな感じで JSON API を作っておく。
JSON 全体をあらかじめ Ruby で前処理しておくのが楽ちん。
JavaScript で JSON を利用する
まずは JavaScript のライブラリを選定。
Chart.js
http://www.chartjs.org/
こいつを組み込んだら、あとは JSON API を叩いて Chart.js に渡すところだけ書いてあげれば良い。
function getBalance() {
var data = null
var req = new XMLHttpRequest();
req.open("GET", "/api/balance/show", false);
req.send(null);
if(req.readyState == 4 && req.status == 200) {
data = req.responseText; // JSON API の戻りを data に格納
};
return JSON.parse(data) // data を返却する
}
var ctx = document.getElementById("BalanceChart"); // DOM を指定
var balanceChart = new Chart(ctx, getBalance()); // Bar Chart のデータとして getBalance 関数の戻り値の JSON を利用
結果
できました。
あとはこの要領で JavaScript ライブラリを駆使してデータの可視化をガンガンおこなえますから便利ですね。
おわりです。