サマリ
- モデルの複雑な関連付けの方法
- 1つのテーブル
relationship
を使って、follower
とfollowing
を管理する方法
- 1つのテーブル
- ネストしたルーティングの実装
- ajaxの実装
ポイント
テーブル名と異なるカラムをFKとして使用したい場合
1対多の1側
# user.rb
has_many :active_relationships, class_name: "Relationship",
foreign_key: "follower_id",
dependent: :destroy
1対多の多側
# relationship.rb
# follower_idカラムが存在している必要がある
belongs_to :follower, class_name: "User"
has_many
とbelongs_to
について
has_many
で指定できるパターン
# モデルの複数形 e.g. microposts
has_many :microposts
# 別名のシンボル、クラス名、FK
has_many :active_relationships, class_name: "Relationship",
foreign_key: "follower_id"
- 関連付けとは別に、
has_many :hoge, through: :fuga, source: :foobar
を定義しておくと、こ配列``
belongs_to
で指定できるパターン
デフォルトでは外部キーの名前を_idといったパターンとして理解し、 に当たる部分からクラス名を推測する
- モデルのシンボル
- 別名とクラス名
class Relationship < ApplicationRecord
belongs_to :follower, class_name: "User"
belongs_to :followed, class_name: "User"
end
ルーティングのカスタマイズ - ネストしたURLの設定
# /users/1/following や /users/1/followers
resources :users do
member do
get :following, :followers
end
end
# /users/tigers
resources :users do
collection do
get :tigers
end
end
Ajaxの実装方法
- ローカル変数ではなくインスタンス変数への変更が必要
- viewには
form_for
の引数に, remote: true
を追加する - controllerには
respond_to
を追加する
def create
@user = User.find(params[:followed_id])
current_user.follow(@user)
respond_to do |format|
format.html { redirect_to @user }
format.js
end
end
アンパサンド(&)を使ったブロックの短縮表記
# 以下は同値
[1, 2, 3, 4].map { |i| i.to_s }
[1, 2, 3, 4].map(&:to_s)
感想
- めちゃくちゃ時間がかかったがなんとか完走することができた
- チュートリアルとはいえtwitter風の動くアプリが完成したのは嬉しい
- まだまだ理解しきったといえる状態ではないので、3周目4週目をやりながら使いこなしていきたい