Rails の belongs_to 関連付け:詳細解説
はじめに
Ruby on Rails の belongs_to
関連付けは、モデル間の関係を定義する上で非常に重要な役割を果たします。この記事では、belongs_to
関連付けの詳細について解説していきます。
belongs_to 関連付けとは?
belongs_to
関連付けは、「このモデルは別のモデルに属している」という関係を表します。データベースの観点から見ると、この関連付けは「このモデルのテーブルに、別のテーブルを参照するためのカラムが含まれている」ことを意味します。
具体例:
class Book < ApplicationRecord
belongs_to :author
end
class Author < ApplicationRecord
has_many :books
end
この例では、Book
モデルが Author
モデルに属しています。つまり、books
テーブルには author_id
というカラムが存在し、これが authors
テーブルの id
を参照しています。
belongs_to 関連付けで追加されるメソッド
belongs_to
関連付けを宣言すると、以下の 9 つのメソッドが自動的に利用できるようになります。ここでは、Book
モデルが Author
モデルに属している例で説明します。
-
association
(例:book.author
)- 関連付けられたオブジェクトを返します。関連付けられたオブジェクトがない場合は
nil
を返します。
- 関連付けられたオブジェクトを返します。関連付けられたオブジェクトがない場合は
-
association=(associate)
(例:book.author = an_author
)- 関連付けられたオブジェクトを割り当てます。これは内部で外部キーを更新します。
-
build_association(attributes = {})
(例:book.build_author(name: "Leo Tolstoy")
)- 関連付けられた型の新しいオブジェクトを作成します。これは保存されません。
-
create_association(attributes = {})
(例:book.create_author(name: "Jane Austen")
)- 関連付けられた型の新しいオブジェクトを作成し、保存します。
-
create_association!(attributes = {})
(例:book.create_author!(name: "Charles Dickens")
)-
create_association
と同じですが、保存に失敗した場合に例外を発生させます。
-
-
reload_association
(例:book.reload_author
)- キャッシュされている関連付けられたオブジェクトを再読み込みします。
-
reset_association
(例:book.reset_author
)- キャッシュされている関連付けられたオブジェクトをクリアします。
-
association_changed?
(例:book.author_changed?
)- 関連付けられたオブジェクトが変更されたかどうかを確認します。
-
association_previously_changed?
(例:book.author_previously_changed?
)- 関連付けられたオブジェクトが前回の保存操作で変更されたかどうかを確認します。
belongs_to の使い方と注意点
-
外部キー:
belongs_to
を使用する場合、デフォルトでは{関連名}_id
という名前の外部キーを探します。例えば、belongs_to :author
の場合、author_id
という外部キーを探します。class Book < ApplicationRecord belongs_to :author # books テーブルに author_id カラムが必要 end
-
オプション:
belongs_to
にはさまざまなオプションを指定できます。よく使われるものをいくつか紹介します。-
optional: true
:関連付けを任意にします(Rails 5以降ではデフォルトで必須)。
belongs_to :author, optional: true
-
class_name
:関連付けるモデルクラス名を指定します。
belongs_to :writer, class_name: "Author"
-
foreign_key
:使用する外部キーの名前を指定します。
belongs_to :author, foreign_key: "writer_id"
-
-
バリデーション:
Rails 5以降、belongs_to
関連付けはデフォルトで存在性のバリデーションを行います。これを無効にするにはoptional: true
を使用します。 -
ポリモーフィック関連付け:
1つのbelongs_to
関連付けで複数のモデルと関連付けることができます。class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true end class Article < ApplicationRecord has_many :comments, as: :commentable end class Photo < ApplicationRecord has_many :comments, as: :commentable end
まとめ
belongs_to
関連付けは、Rails アプリケーションでモデル間の関係を定義する上で非常に重要です。この関連付けを使いこなすことで、より柔軟で保守性の高いコードを書くことができます。
参考