3. 1:1 関係表現 — has_one
アソシエーション
- 一つのオブジェクトが他のオブジェクトと独占的な一対一(1:1)関係を持つ場合に使用
- 一つのモデルのインスタンスが他のモデルのたった一つのインスタンスとのみ関連を持っていることを示す
- ユーザープロファイル、アカウント設定、配送情報など、個人的またはユニークな関係を要求するデータモデリングに有用
1) 基本概念
- 主モデルは関連モデルの一つのインスタンスを「所有」しているかのように動作
- 例えば、ユーザー(
User
)とそのユーザーのプロファイル(Profile
)間の関係
- 各ユーザーは一つのプロファイルを持つことができ、各プロファイルは特定のユーザーにのみ属していなければならない。
2) モデル設定
- 所有しているモデル側で
has_one
キーワードを使用
- 関連モデルの名前は通常、単数形で使用される
class User < ApplicationRecord
has_one :profile
end
User
モデルが Profile
モデルと一対一の関係を持つことを宣言
- この関係は
profiles
テーブルに user_id
という外部キーが存在
- 外部キーが
users
テーブルの主キーと連携していることを前提としている
3) 関係の使用
has_one
関係が設定されると、User
モデルのインスタンスは .profile
メソッドを通じて関連する Profile
オブジェクトにアクセス可能
- このメソッドを使用してプロファイルデータに容易にアクセスし、必要に応じて修正可能。
@user = User.find(1)
@profile = @user.profile
4) データ生成と接続
- 新しい関連オブジェクトを生成するのも簡単
build_
や create_
接頭辞を使用したメソッドで新しい Profile
インスタンスを生成し、現在の User
インスタンスに自動的に接続できる。
@user = User.find(1)
@user.create_profile(phone_number: "123-456-7890")
5) オプションと拡張
:class_name
— 実際のクラス名と異なる場合に使用
:foreign_key
— 外部キーの名前を異なるものに設定したい場合に使用
:dependent
— 関連オブジェクトのライフサイクルを管理(例: destroy
, nullify
)。
class User < ApplicationRecord
has_one :profile, dependent: :destroy
end