Rails4 でグラフを描いてみる ( Lazy_high_charts , Chartkick )
データベースに保存されたデータをグラフで綺麗に表示させたいなーと思ったので、調べたことやつまづいたことをまとめようと思います。
gemを探すにあたって、以下の記事を参考にしました。
Ruby on Rails で使えるグラフ・チャート用ライブラリまとめ | EasyRamble
さて、今回は Lazy_high_chartとChartkickの2つのGemを使ってみました。
Lazy_high_chartを使ってみた感想としては、 Good
- ラベルなどの指定を結構細かくできる
- グラフが綺麗(Highchartsのグラフのデザインが素敵)
- グラフの種類が豊富で、結構細かな設定ができる
Bad
- Capistranoでproduction環境にdeployした時に、Asset:precompileがフリーズした(地味にかなりハマる。javascript_include_tagで直接指定して対策)
次に、Chartkickを使った感想としては、
Good
- シンプルで実装がとても簡単
- google chart と highchartsのグラフどちらでも表示できる
- library:{ ... }の中に、上記apiのオプションを指定することで、タイトルや軸の設定ができる
Bad
- 線の種類が4種類に限定される。
- 線グラフがスプラインに限定される
いずれも詳細設定は、Javascriptからおこなうことになりそうです。 今回、Lazy_high_chartとChartkickの2つを試してみましたが、 どちらもサクッとグラフを描くことができる素敵なGemでした!
Railsのパフォーマンスを上げるTIPS
最近ようやくRailsアプリのパフォーマンスを気にかけられるようになってきました。 ActiveRecordはとても便利ですが、レコードが増えてくるとどんどん重くなってきますので、設計の段階から対策をとっておきたいものです。 導入コストが少ない対策としては、 * SQLに索引をつける * N+1問題に気をつける * キャッシュを使う * 無駄なデータを引きすぎてる などがポイントなようです。
これからさらに勉強するために、参考になる記事をまとめてみました。
さいきんの Rails サービスを高速化をしてみた - 2nd life
[Rails 高速化] ページキャッシュ、N+1対策、SQLチューニング - 酒と泪とRubyとRailsと
Rils4で Russian Doll Caching を楽しむためのまとめ [俺の備忘録]
現実の世界の Rails、第 3 回: ActiveRecord を最適化する
勉強している間に参考になった記事があったら追加していきます。
Rails 4 と KoalaでFacebook Graph APIをつかう
Koalaを使ってFacebookイベントに参加した人の名前を取得してみます。
Gemfile
gem 'koala'
bundle install
FBのディベロッパーページから、アクセストークンをコピーする。
key = {ACCESS_TOKEN} graph = Koala::Facebook::API.new(key) fb_event_id = {FACEBOOK_EVENT_ID} status = {RSVP_STATUS} #ここでは"attending" attendee = graph.get_connections(fb_event_id, status, locale: "jp_JP")
これでattendeeに参加者の名前(日本語名)と、IDがハッシュ形式で取得されます。 ちなみにRSVP_STATUSは"attending"、"maybe"、"declined"、"noreply"がありますので、目的に合わせて使い分けます。
Rails + rbenv + Capistrano + EC2 + Apache + Passenger
EC2のデプロイで色々と手順が増えたので、まとめてみます。 (抜けているところは、後々追記していきます。)
- EC2のセキュリティーグループを作成
- EC2のインスタンスを作成
- 公開キーを保存
- 公開キーのパーミションを変更
- EC2のElasticIPを作成
- EC2のElasticIPとインスタンスを紐付け
- ターミナルからEC2のサーバーにSSH接続
- EC2のサーバーに下記をインストール
sudo yum install \ git make gcc-c++ patch \ libyaml-devel libffi-devel libicu-devel \ zlib-devel readline-devel \ mysql mysql-devel sqlite sqlite-devel
- EC2のサーバーにrbenvをインストール
- EC2のサーバーにrubyをインストール
- 開発環境のバージョンと合わせること
- EC2のサーバーにapacheをインストール
- EC2のサーバーにpassengerをインストール
- EC2のサーバーの公開キーを作成
- EC2のサーバーに公開用Rootディレクトリを作成
- sudo chown ec2-user myproject
- sudo chgrp ec2-user myproject
- Githubに公開キーを登録
- Githubにリモートレポジトリを作成
- GithubのリモートレポジトリにPush
- 開発環境にcapistranoをインストール
- Capfileを編集
- rbenv_type は :systemか:userにすること
- config/deploy.rbを編集
- config/deploy/production.rbを編集
- database.ymlを編集
- productionの/db/production.sqlite3から/var/www/APP_NAME/db/production.sqlite3に変更
参考
Upgrade to Capistrano 3.0 - Qiita
EC2 (Amazon Linux) に Ruby on Rails + Passenger + Apache 環境を構築する | Developers.IO
【Rails4】参照キーが関連付けたテーブルに存在しない場合にレコードを取得する方法
タイトルが長いw
目的
has_manyで関連付けたテーブルに参照キーが存在しないときにレコードを取得すること。
Member.where.not(:id => Relationship.select(:member_id).map(&:member_id))
Relationshipテーブルに記録されたmember_idを配列にしています。
Rails4のhas_many throughで条件を指定してレコードを参照する
目的
Rails4のhas_many throughで条件を指定してレコードを参照する
前提
rails 4.0.0を使います。 テーブルは以下のように作っているとします。
#relationshipテーブル id: integer member_id: integer event_id: integer flg: boolean status: integer #memberテーブル id: integer #eventテーブル id: integer
model/relationship.rb
まずはrelationshipモデルで関連付けをします。
belongs_to :member, class_name: "Member" belongs_to :event, class_name: "Event"
model/event.rb
次にeventモデルで参照について記述します。 ここでは、relationshipテーブルのflgカラムがtrueのレコードと、statusカラムが'3'のレコードを取得しています。
has_many :relationships, foreign_key: "event_id", dependent: :destroy has_many :hoge, -> {where flg: true}, class_name: "Relationship", through: :relationships, source: :member has_many :fuga, -> { where "status = 3"}, through: :relationships, source: :member
以上でhas_many throughで条件を指定してレコードを参照することができます。
参考
Capistrano 3 の設定
目的
Capistrano 3.x でデプロイ環境を作ること。
環境
- 開発、本番環境ともに、rbenv(0.4.0)でRuby( 2.0.0-p247)をインストール済み。
- 本番サーバーはAWS EC2 Linux。インスタンスとセキュリティーグループ設定済み。
- レポジトリ管理はgithub。github上にてレポジトリ作成済み。開発、本番環境ともに、ssh-keyの設定済み。
- DBは開発、本番環境ともにsqlite。
- 本番環境のデプロイ先のディレクトリは、/var/www/。
Gemfile
Gemfileを編集します。
group :development do gem "capistrano-bundler" gem "capistrano-rails" gem "capistrano-rbenv" end
続いてインストール。
bundle install bundle exec cap install
Capfile
出来上がったCapfileを編集します。
require 'capistrano/setup' require 'capistrano/deploy' require 'capistrano/rbenv' set :rbenv_type, :system set :rbenv_ruby, "2.0.0-p247" require 'capistrano/bundler' require 'capistrano/rails/assets' require 'capistrano/rails/migrations' Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }
config/deploy.rb
deploy.rbでデプロイ先のディレクトリと、レポジトリなどの設定をします。
lock '3.1.0' set :application, <application_name> set :scm, :git set :repo_url, 'git@github.com:<git_user_name>/<repository>.git' set :deploy_to, '/var/www/<application_name>' set :branch, "master" set :format, :pretty set :log_level, :debug set :keep_releases, 5 namespace :deploy do desc "Restart application" task :restart do on roles(:app), in: :sequence, wait: 5 do execute :mkdir, '-p', release_path.join('tmp') excute :touch, release_path.join("tmp/restart.txt") end end after :finishing, "deploy:cleanup" end
config/deploy/production.rb
本番環境のサーバー接続の設定をします。
set :stage, :production role :app, %w{ec2-user@ec2-XX-XXX-XX-XX.region.compute.amazonaws.com} role :web, %w{ec2-user@ec2-XX-XXX-XX-XX.region.compute.amazonaws.com} role :db, %w{ec2-user@ec2-XX-XXX-XX-XX.region.compute.amazonaws.com} set :ssh_options, { keys: [File.expand_path('~/.ssh/<public_key>')], forward_agent: true }
デプロイ
cap production deploy