DAY35 Association : `has_one `

TOKHEE·2024년 5월 9일
0

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

0개의 댓글

관련 채용 정보