FUMINORI.WORK

Webアプリ開発・スマホアプリ開発・UIデザイン・マーケティング

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で条件を指定してレコードを参照することができます。

参考

Active Record Associations — Ruby on Rails Guides (4.3.3.1)

Capistrano 3 の設定

目的

Capistrano 3.x でデプロイ環境を作ること。

環境

  • 開発、本番環境ともに、rbenv(0.4.0)でRuby( 2.0.0-p247)をインストール済み。
  • 本番サーバーはAWS EC2 Linuxインスタンスとセキュリティーグループ設定済み。
  • レポジトリ管理はgithubgithub上にてレポジトリ作成済み。開発、本番環境ともに、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

参考文献