2. 1:n 関係 — has_many
アソシエーション
- 一対多(1:n)の関係を表現
- 一つのモデルのインスタンスが他のモデルの複数のインスタンスと関係を結ぶことを示します
1) 基本概念
has_many
関係では、「一つ」のエンティティが「複数の」関連エンティティを持つことができます
- 例えば、一つのブログポストは複数のコメントを持つことができます
- ここでの
Post
モデルは Comment
モデルとの has_many
関係があります
Post
一つに複数の Comment
が接続できることを意味します
2) モデル設定
- 主モデルに
has_many
キーワードを使用して関係を宣言
- 関係の名前は関連モデルの複数形で表現されます
- 例えば、一つの
Post
が複数の Comment
を持つ場合は comments
となります
class Post < ApplicationRecord
has_many :comments
end
3) 関係の使用
- 関係が設定されると、
Post
モデルのインスタンスは .comments
メソッドを通じて接続された全ての Comment
オブジェクトにアクセスできます
- このメソッドは
Comment
の集合を返します
- この集合に対して配列のように動作する多くのメソッド(
each
、map
、find
など)を使用できます
@post = Post.find(1)
@comments = @post.comments
4) 生成と接続
- 新しい関連オブジェクトを生成して自動的に接続することが簡単に可能です
build
メソッドや create
メソッドを使用します
- それぞれ新しいオブジェクトをメモリにのみ生成するか、データベースに保存してオブジェクトを返します
@post = Post.find(1)
@comment = @post.comments.create(body: "Great post!")
5) オプションと拡張
:class_name
オプションを通じて実際のクラス名と異なる名前を関係名として使用できます
:through
オプションを使用して他のモデルを経由する複雑な関係を設定できます
:dependent
オプションを使用して関連オブジェクトのライフサイクルを親オブジェクトと連動させることができます(例:dependent: :destroy
)。
class User < ApplicationRecord
has_many :posts
has_many :comments, through: :posts
end