Rails多対多のアソシエーションの設定

Railsにおける多対多のアソシエーションの設定について紹介します。

モデルのアソシエーション

今回使用するテーブルは下記のようになっています。

多Tagsモデル
多Boardsモデル
中間テーブルのboard_tag_relations

 多についてはNと示すこともあります。

モデルの作成コマンド

下記にてモデルの作成をします。

rails g tag name:string
rails g boards name:string

モデルを作成後、中間テーブルとなるモデルを作成します。

rails g board_tag_relations Boards:references Tags:references 

Boards:references Tags:referencesのように記述することで
マイグレーションは以下のように自動的に外部キーが設定された形で作成されています。

モデル

Tagsモデル

class Tag < ApplicationRecord
    has_many :board_tag_relations, dependent: :delete_all
    has_many :boards, through: :board_tag_relations
end

Boardsモデル

class Board < ApplicationRecord
    has_many :comments, dependent: :delete_all
    has_many :board_tag_relations, dependent: :delete_all
    has_many :tags, through: :board_tag_relations
end

中間テーブルのboard_tag_relations

class BoardTagRelation < ApplicationRecord
  belongs_to :board
  belongs_to :tag
end

上記のコードではBoard はboard_tag_relationsを複数持っている
through: :board_tag_relations(中間テーブル)を通してtagsを複数持っている

中間テーブルとなるモデルを作成するコマンドを実行する際に以下の通り記述をしました。

rails g board_tag_relations Boards:references Tags:references 

Boards:references Tags:references のように記述する事により作成された外部キーを中間テーブルを持っているのでこのように記述するが出来ます。

Boardsモデル、Tagsモデルには手動で追加する必要があります。
多対多の形での実装では、中間テーブルとのhas_many関係の記述と、その中間テーブルを通したBoardsモデル、Tagsモデルとの紐付けの2つのhas_many throughを記述する必要があります。

 :delete_allは上記のコマンドでは作成されないので注意

いまのHas_manyの設定ではBoardsやTaguを削除した際にを設定した時に関連したデータが残ってしまうのでdelete_allを既述します。

delete, delete_all, destroy, destroy_allについての記述

ここまでがModelでの記述になります。
とりあえずはこのくらいで終わりにします。

おすすめの記事