🐱

Active Recordの関連付け(has_one)

2024/11/08に公開

前回のbelongs_toの記事に続いて今回はhas_oneを文章でまとめていく

has_one

has_one関連付けは相手側のモデルがこのモデルへの参照を持っていることを示しており、
相手側のモデルは、参照(foreign_keyなど)を通して、fetchすることができる。

具体例

今回はケースとして従業員テーブル(employee)と職員証テーブル(employee_card)
で考える。職員ごとに職員証が一つ存在する場合は、以下のように宣言する

class Employee < ApplicationRecord
  has_one : employee_card
end

belogns_toとの違いはリンクカラム(employee_id)が相手側のテーブルにあり、has_oneを宣言したテーブルには存在しないこと。(employeeテーブルにはemployee_id元カラムのidしかない)

マイグレーションは以下の通り

class CreateEmployees < ActiveRecord:Migration
  def change
    create_table :employees do |t|
      t.string :name
      t.timestamps
    end

    create_table :employee_card do |t|
      t.references :employee, index: { unique: true }, foreign_key: true
      t.string :employee_number
      t.timestamps
    end
  end
end

追加されるメソッド

上記のケースでは以下のメソッドが追加される

  • employee_card
    @employee_card = @employee.employee_card
  • employee_card=
  • build_employee_card
  • create_employee_card
  • create_employee_card!
  • reload_employee_card
  • reset_employee_card

Discussion