FUMINORI.WORK

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

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

参考文献

AWS EC2でGitを設定

GitをEC2サーバにインストール

[ec2-user@ip-XX-XX-XXX-XX ~]$ sudo yum install git

EC2サーバの/var/www/のパーミションを追加

[ec2-user@ip-XX-XX-XXX-XX ~]$ sudo chgrp ec2-user /var/www
[ec2-user@ip-XX-XX-XXX-XX ~]$ sudo chmod 775 /var/www
[ec2-user@ip-XX-XX-XXX-XX ~]$ sudo chown -R ec2-user /var/www/

EC2サーバのpublic keyを作成

[ec2-user@ip-XX-XX-XXX-XX ~]$ ssh-keygen
[ec2-user@ip-XX-XX-XXX-XX ~]$ sudo chmod 700 /home/ec2-user/.ssh/id_rsa.pub
[ec2-user@ip-XX-XX-XXX-XX ~]$ ssh-add /home/ec2-user/.ssh/id_rsa.pub

ssh-addでエラーが出た場合)

[ec2-user@ip-XX-XX-XXX-XX ~]$ eval `ssh-agent -s`
[ec2-user@ip-XX-XX-XXX-XX ~]$ ssh-add /home/ec2-user/.ssh/id_rsa.pub

EC2サーバのid_rsa.pubの中身をコピー

[ec2-user@ip-XX-XX-XXX-XX ~]$ vim /home/ec2-user/.ssh/id_rsa.pub

githubに公開キーを登録

githubのaccount setting ページのSSH keys に行き、Add ssh keyを押して、先ほどコピーしたid_rsa.pubの中身をペースト。

AWS Linux server の時刻を日本時間に設定する

目的

AWS Linux server の時刻を日本時間に設定する

 

[ec2-user@... ]$ date

としたら、時刻が日本時刻とずれていたので直しますよと。

 

手順

[ec2-user@... ]$ sudo mv /etc/localtime /etc/_localtime

[ec2-user@... ]$ cp /usr/share/zoneinfo/Japan /etc/localtime

 

以上でサーバー時刻が日本時間に同期されます。

 

参考:

EC2の時間を日本時間に設定する方法【cpコマンドだけでOK】 - Hive Color