読者です 読者をやめる 読者になる 読者になる

Ruby + Heroku + Highchartsで食べたリンゴの割合をグラフ化してみた、時に悩んだことのまとめ

Heroku Padrino Ruby

前回はグラフ化をしてみましたが、その実装をする時に色々と悩んだため、忘れないようにメモとリンクを残しておきます。

■良くない設計:リンゴの種類をYAMLファイルに持たせたこと

本来ならDBにマスタとして入れておくのが正解なのでしょうが、YAMLファイル一つでリンゴの種類と色をメンテナンスしたいと考えました。
実装方法としてはいかがなものかという内容ですが、個人的なものだったので、以下の方法を採用しました。

  • リンゴの種類と、Highchartsで表示した時の色を、YAMLファイルに記載
  • Appleテーブルは色を持たない
  • モデルへ入れる際のSELECTで、ダミーの列を取得
  • JSONで渡す際に、app/helpers/apples_helper.rb のadd_colorメソッドで、モデルのダミー項目を上書き


もっとうまい書き方があるかもしれませんが、現時点では仕方ないと割り切りました。


2013/03/31 追記
続編で、ダミー列を取得する代わりに、Structクラスを利用する方法へと変更しました。
Ruby + Heroku + Highchartsで食べたリンゴを月別にグラフ化してみた - メモ的な思考的な



Ruby・Padrinoまわり

tasks/gather_timeline.rbとdb/seeds.rbでロジックが重複しそうだった

viewとcontrollerであれば、apps/helpersに記載すればロジックをまとめられそうだったけれど、それ以外で共有する方法は分かりませんでした。
いろいろと試してみたところ、seeds.rbからはgather_timeline.rbのメソッドを参照できたため、gather_timeline.rbにロジックをまとめました。


なお、初めの頃は「[リンゴ]」始まりではツイートしていなかったため、seedで初期データ投入する時に限り「[リンゴ]」始まりでなくてもDBに入れたいと考えました。
そのため、以下を参考にして、「[リンゴ]」始まりかどうかをチェックするメソッドを、lambda(->)で渡すようにしました*1

Appleテーブルからデータを取るときのロジックの記載場所

コントローラーとモデル、どちらに書くのか悩みました。
ActiveRecordでの「scope」を知ったので、モデルに記載し、「count_apple」メソッドとして呼び出せるようにしました。


PadrinoでJSONを返す方法

providesでjsonを指定して、to_jsonで返しました。

get :api, provides: :json, map: '/api' do

  tweets = Apple.count_apple
  add_color(tweets).to_json
end
YAMLファイルを読み込み、シンボルでアクセスできるようにする

YAMLファイルを読み込んだだけではシンボルでのアクセスができないため、今回はActiveSupportのHashWithIndifferentAccessを使ってシンボルへ変換しました。

HashWithIndifferentAccess.new(YAML.load_file("<file path>"))
Rake taskの記載箇所

公式ページに書いてありました。今回は「tasks/gather_timeline.rb」としました。
Guides Rake Tasks - Padrino Ruby Web Framework


Rake Taskで、処理を飛ばしたい時

nextを使うとのこと。
ruby - How do I return early from a rake task? - Stack Overflow


引数で、必須とオプションの書き方

メソッド側の記載方法は以下、使う側は「validation:」のような形でオプション引数を指定できるようです。

def update_apple(apples, response, args = {})
  if args[:validation] && args[:validation].call(response.text)
    return
  end
  〜略〜
end

Hash引数便利よね - Slow Dance


ActiveRecordでのbigintの設定方法

ローカルのSQLiteではintegerだけの一方、PostgreSQLではintegerとbigintがあります。
そのため、ActiveRecordでbigintを明示的に指定しました。
Rails 3 + PostgreSQLでINTEGER型のカラムをBIGINT型に変更するマイグレーションスクリプトを書いた。 - Sooey




Twitter Gemまわり

どのライブラリを使うか

Twitterのページを見たところ、「Twitter gem」が紹介されていたので、そちらを使うことにしました。

■Highcharts関連

Highchartsのパラメータの書き方

Highchartsの設定は、public/javascripts/application.js に記載しました。


なお、Webのサンプルの中には1系列での記載もあり、うまく動作しなかったため、以下の内容などで悩みました。

  • pieでの凡例は、plotOptionsの中のshowInLegendをtrueにして表示
  • 初期段階ではseriesのdataは空にしておき、getJSONにて chart.series[0].addPointを使い、リンゴ種類ごとの個数を設定


公式ドキュメントを頼りに、色々と試しながらの実装でした。
Highcharts API Reference



■Heroku関連

Herokuでのスケジュールジョブ

以前のCronアドオンから、Heroku Schedulerアドオンに切り替わったようですので、後者を使うようにしました。
Heroku Schedulerアドオンがリリース - Force.com Blog Japan


*1:個人的に、Rubyのlambdaを使ってみたかったということもあります