🐷

Active Recordの関連付け(has_many)

2024/11/09に公開

前回のhas_oneに引き続いて今回はhas_manyについて文章でまとめていく

has_manyとは?

has_manyの関連付けは1対多の繋がりを表しており、has_manyで関連付けを行う際には
多くの場合、belongs_toの反対側で使われる。
has_manyの関連付けはそのモデルのインスタンスが相手のモデルのインスタンスを0個以上持っていることを示している。

具体例

今回はschoolモデル(1)とstudentsモデル(多)で考えてみる。

class School < ApplicationRecord
  has_many :students、 dependent: destory
end

class Student < ApplicationRecord
  belongs_to :school, inverse_of: students
end

関連付けで追加されるメソッド

  • students
  • students<<(object)
  • students.delete(object)
  • students.destroy(object)
  • students=
  • student_ids
  • students.clear
  • students.empty?
  • students.size
  • students.find
  • studetns.where
  • students.exists?
  • students.build
  • students.create
  • studentsreload

以下はよく使うメソッドの解説
@students = @school.students
関連付けられた全てのオブシェくとのリレーションを返す。
関連付けられたオブジェクトがない場合は空のリレーションを返す。

@school.students.destory(@student1)
関連付けられているオブジェクトに対してdestoryを実行することで、コレクションからオブジェクトを
1つ以上削除する。

@student_ids = @school.student_ids
コレクションに含まれるオブジェクトのidを配列にして返す。

@school.students.empty?
関連付けられたオブジェクがコレクションに存在しない場合にtrueを返す

@school.studetns.size
コレクションに含まれるオブジェクトの個数を返す

@school.students.find(1)
コレクションに含まれるオブジェクトを返す

@available_books = @school.students.where(available: true)
コレクションに含まれるオブジェクトを指定された条件に基づいて検索する。

@student = @school.studentes.build(name: "foo", number: 2)
関連付けされたオブジェクトを返す。関連付けられたオブジェクトは保存されていない

@student = @school.studentes.create(name: "foo", number: 2)
こちらは保存される

Railsガイド(Active Recordの関連付け参照)

Discussion