アソシエーション
アソシエーション
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 「多対多」 たくさんのユーザーとたくさんの本、それを結ぶ中間テーブルがあるときに使います。