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 アプリケーションでモデル間の関係を定義する上で非常に重要です。この関連付けを使いこなすことで、より柔軟で保守性の高いコードを書くことができます。
参考