has_manyとbelongs_to【テーブル同士の関連付け】
例:ウェブアプリに登録しているユーザのテーブル(Usersテーブル)とそのウェブアプリで登録したユーザが投稿したつぶやきを管理しているテーブル(Micropostsテーブル)を関連付けしたい
class User < ApplicationRecord has_many :microposts end
↑1人のユーザに複数のつぶやきがあるという関連付け
class Micropost < ApplicationRecord belongs_to :user end
↑1つのつぶやきは必ず1人のユーザと結びついているという関連付け
この関連付けをしていることでできること
①ユーザテーブルとつぶやきを管理しているテーブルのデータを合わせて取得できる
>@user = User.first (ユーザテーブルに登録されている1人目のデータを取得して@userに代入する) >@user.microposts (ユーザテーブルに登録されている1人目のつぶやきを全て表示する) (↓のように1行で表示することも可) >User.first.microposts
②いくつかのメソッドが使えるようになる
メソッド | 用途 |
---|---|
micropost.user | Micropostに紐付いたUserオブジェクトを返す |
user.microposts | Userのマイクロポストの集合をかえす |
user.microposts.create | userに紐付いたマイクロポストを作成する |
user.microposts.create! | userに紐付いたマイクロポストを作成する(失敗時に例外を発生) |
user.microposts.build | userに紐付いた新しいMicropostオブジェクトを返す |
user.microposts.find_by(id: 1) | userに紐付いていて、idが1であるマイクロポストを検索する |
※user.microposts.build
はnewメソッドと同様、オブジェクトを返すがデータベースには反映されない
ユーザーが削除されたら投稿も削除されるようにする設定
dependent: :destroy
を追加する
class User < ApplicationRecord has_many :microposts, dependent: :destroy end