多対多のリレーションを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