dev/mom0tomo

技術メモ

多対多のリレーションをhas_manyでモデルに実装する

Railsでは、ActiveRecordのhas_manyかhas_and_belongs_to_manyを使うことで、多対多のテーブルどうしの関連をモデルに実装できる。
基本的には拡張性のあるhas_manyを使った方がよい。

マイグレーションファイルをつくる

Twitterクローンの例をもとに、userが micropost を likeする例で考える。 usersテーブルとmicropostsテーブルを作成し、中間テーブル(likesテーブル)に両方のテーブルの外部キーを定義する。

$ rails g model User name:string

$ rails g model Micropost content:string

$ rails g model Like user_id:integer micropost_id:integer

モデルにthroughオプションをつける

throughオプションにより、usersからlikes経由でmicropostsにアクセスできるようになる。 つまり、user.micropostsという形が使える。

app/models/user.rb

class User < ActiveRecord::Base
  has_many :likes
  has_many :microposts, through: :likes
end

micropostからuserも同じく、micropost.usersと言う形が使える。

app/models/micropost.rb

class Micropost < ActiveRecord::Base
  has_many :likes
  has_many :users, through: :likes

中間テーブルとの関係はbelongs_toで表す。

app/models/like.rb

class Like < ActiveRecord::Base
  belongs_to :user
  belongs_to :micropost
end