モデル間に従属関係がある場合、モデルにアソシエーションを記述して関係性を明示しておくことで、テーブルをjoinするSQLをRailsのActiveRecordが自動的に裏で実行してくれるようになり、直感的な情報アクセスが可能になります。
app/models/comment_model.rb
class CommentModel < ActiveRecord::Base
belongs_to :user # ←単数形
end
belongs_to とは逆の概念です。主従関係は同じであり、テーブル構成も同じです。以下のようなメソッドが使用できるようになります。
app/models/user_model.rb
class UserModel < ActiveRecord::Base
has_many :comments # ←複数形
end
belongs_to の特殊な場合における逆の概念です。主従関係は同じであり、テーブル構成も同じです。特殊な場合とは、異なる二つのものが、同じものにbelongしないことが保証されている場合のことを差します。以下のようなメソッドが使用できるようになります。
app/models/user_model.rb
class UserModel < ActiveRecord::Base
has_one :comment # ←単数形
end
「has_one」と「belongs_to」の関係において、どちらのテーブルに外部キーを持たせるかは、それらの主従関係を考えて決定します。「has_one」する側は他方を必要としません。「belongs_to」する側は自分が存在のために他方を必要とします。
多対多の場合です。主従関係はありません。中間テーブルが必要となります。中間テーブルの名称は、参照先テーブルを辞書順にアンダーバー '_' でつなげたものとします。中間テーブルに独自の情報列は作成せず、したがって対応するモデルも不要です。HBTMとも称します。以下のようなメソッドが使用できるようになります。
app/models/author_model.rb
class AuthorModel < ActiveRecord::Base
has_and_belongs_to_many :books
end
app/models/book_model.rb
class BookModel < ActiveRecord::Base
has_and_belongs_to_many :authors
end
「has_and_belongs_to_many」において、中間テーブル自体は情報を有さず、したがってモデルも存在しませんでした。そうではなく、情報を有する存在意義のあるモデルが中間となり、二つのモデルに「has_and_belongs_to_many」の関係を与える場合は「has_many through」を使用します。
app/models/user_model.rb
class UserModel < ActiveRecord::Base
has_many :reviews
has_many :books, through: :reviews
end
app/models/review_model.rb
class ReviewModel < ActiveRecord::Base
belongs_to :user
belongs_to :book
end
app/models/book_model.rb
class BookModel < ActiveRecord::Base
has_many :reviews
has_many :users, through: :reviews
end