This page looks best with JavaScript enabled

【Rails】一対一対多のアソシエーション

 ·   ·  ☕ 2 分で読めます
✏️

結局は基本的なことなのですが、少し変わると途端にハマってしまう。
アソシエーションがうまくいかずに時間を溶かしてしまったので、そんな過去の自分といるかもしれない未来の誰かのために書き残しておきます。

テーブル構造

UserモデルとTagモデルの中間テーブルから派生させたTagSettingモデルを作りました。

erd.jpg

ただ、今回の話にはUserモデルはあまり関係ありません。
また、この後「tag_usersとtag_settingsを別々にしなくていいんじゃないか?」という指摘を受けてテーブル構造を変えました。なので、例としては少々不適切かもしれませんがご容赦を。

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

1
2
3
4
5
class User < ApplicationRecord
  has_many :tag_users
  has_many :tags, through: :tag_users
  has_many :tag_settings
end
1
2
3
4
5
class TagUser < ApplicationRecord
  belongs_to :user
  belongs_to :tag
  belongs_to :tag_setting
end
1
2
3
4
5
class TagSetting < ApplicationRecord
  has_one :tag_user
  has_one :tag, through: :tag_user
  belongs_to :user
end
1
2
3
4
class Tag < ApplicationRecord
  has_many :tag_users
  has_many :tag_settings, through: :tag_users
end

注意点

中間テーブルへのアソシエーションを追加する

has_many :tag_usersなしでhas_many :tag_settings, through: :tag_usersを定義することはできない。
また、中間テーブルへのアソシエーションの方を上に記述する必要がある。

単数形・複数形に注意する

has_many :tag_settings, through: :tag_users
has_manyのときは:throughも複数形

has_one :tag, through: :tag_user
has_oneのときは:throughも単数形

リンク

Share on

END
END
@aiandrox

目次