学習記録

アウトプット用に作りました

アソシエーション

アソシエーション

Railsで作成するモデルの間に関係性を定義したい場合、
アソシエーションという機能を使うことができます。

userモデルでは、

has_many :tasks, dependent: :destroy

taskモデルでは、

belongs_to :user

が定義されていないとアソシエーションは使えません。


また2つのモデルを紐づけるために外部キーを定義します。
taskモデルに外部キーを付与したいとき、

$ rails g model task user:references

このようにuser:referencesでカラムを作るとuser_idという外部キーを作ることができます。
外部キーのカラムを作ったときは、foreign_key: trueをマイグレーションファイルに追加する必要があります。

taskモデルのレコードから紐づくuserモデルのレコードを取得したいとき、
@user = @task.userと書き、関連レコードの呼び出しを行うことができます。


dependent:オプション

オーナーオブジェクトがdestroyされたとき、
関連づけられたオブジェクトをどうするのか制御するものです。

  • :destroy 関連づけられたオブジェクトも同時にdestroyします。

  • :delete_all 関連づけられたオブジェクトは全てデータベースから直接削除されます。このときコールバックは実行されません。

  • :nullify 外部キーはNULLに設定されます。コールバックは実行されません。

  • restrict_with_exception 関連づけられたレコードが一つでもある場合は例外が発生します。

  • :restrict_with_error 関連づけられたオブジェクトが一つでもある場合にエラーがオーナーオブジェクトに追加されます。


Railsで使うアソシエーション

  • belongs_to 「1対1」
    関連づけで指定するモデル名を単数形にします。

  • has_one 「1対1」
    他方のモデルのインスタンスを丸ごと含んでいる、所有している関係です。

※ belongs_toと has_oneの違いは、、、 belongs_toは一人の著者が何冊かの本を書いている状態で1冊の書籍に1人の著者。
has_oneはユーザー1人につき1つのアカウントを持っている。

  • has_many 「1対多」 反対側のモデルではbelongs_toが使われています。
    相手のモデル名を複数形にします。

  • has_many :through 「多対多」 2つのモデルの間に第3のモデルが介在しているときに使います。

  • has_one :through 「1対1」 例えばユーザー1人につき1つのアカウント、そこに1つのアカウント履歴が関連づいているときに使います。

  • has_one_belongs_tomany 「多対多」 たくさんのユーザーとたくさんの本、それを結ぶ中間テーブルがあるときに使います。