前回はグラフ化をしてみましたが、その実装をする時に色々と悩んだため、忘れないようにメモとリンクを残しておきます。
■良くない設計:リンゴの種類を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
引数で、必須とオプションの書き方
メソッド側の記載方法は以下、使う側は「validation:」のような形でオプション引数を指定できるようです。
def update_apple(apples, response, args = {}) if args[:validation] && args[:validation].call(response.text) return end 〜略〜 end
ActiveRecordでのbigintの設定方法
ローカルのSQLiteではintegerだけの一方、PostgreSQLではintegerとbigintがあります。
そのため、ActiveRecordでbigintを明示的に指定しました。
Rails 3 + PostgreSQLでINTEGER型のカラムをBIGINT型に変更するマイグレーションスクリプトを書いた。 - Sooey
■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