0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Rails] belongs_toの関連付け

Posted at

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 モデルに属している例で説明します。

  1. association (例: book.author)

    • 関連付けられたオブジェクトを返します。関連付けられたオブジェクトがない場合は nil を返します。
  2. association=(associate) (例: book.author = an_author)

    • 関連付けられたオブジェクトを割り当てます。これは内部で外部キーを更新します。
  3. build_association(attributes = {}) (例: book.build_author(name: "Leo Tolstoy"))

    • 関連付けられた型の新しいオブジェクトを作成します。これは保存されません。
  4. create_association(attributes = {}) (例: book.create_author(name: "Jane Austen"))

    • 関連付けられた型の新しいオブジェクトを作成し、保存します。
  5. create_association!(attributes = {}) (例: book.create_author!(name: "Charles Dickens"))

    • create_association と同じですが、保存に失敗した場合に例外を発生させます。
  6. reload_association (例: book.reload_author)

    • キャッシュされている関連付けられたオブジェクトを再読み込みします。
  7. reset_association (例: book.reset_author)

    • キャッシュされている関連付けられたオブジェクトをクリアします。
  8. association_changed? (例: book.author_changed?)

    • 関連付けられたオブジェクトが変更されたかどうかを確認します。
  9. association_previously_changed? (例: book.author_previously_changed?)

    • 関連付けられたオブジェクトが前回の保存操作で変更されたかどうかを確認します。

belongs_to の使い方と注意点

  1. 外部キー
    belongs_to を使用する場合、デフォルトでは {関連名}_id という名前の外部キーを探します。例えば、belongs_to :author の場合、author_id という外部キーを探します。

    class Book < ApplicationRecord
      belongs_to :author
      # books テーブルに author_id カラムが必要
    end
    
  2. オプション
    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"
    
  3. バリデーション
    Rails 5以降、belongs_to 関連付けはデフォルトで存在性のバリデーションを行います。これを無効にするには optional: true を使用します。

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

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?