【Rails】일대일대다의 어소시에이션

2898 단어 RailsActiveRecord
결국은 기본적인 것입니다만, 조금 바뀌면 곧바로 빠져 버린다.
어소시에이션이 잘 되지 않고 시간을 녹여 버렸기 때문에, 그런 과거의 자신과 있을지도 모르는 미래의 누군가를 위해서 남겨 둡니다.

테이블 구조



User 모델과 Tag 모델의 중간 테이블에서 파생된 TagSetting 모델을 만들었습니다.

다만, 이번 이야기에는 User 모델은 그다지 관계가 없습니다.
또, 이 후 「tag_users와 tag_settings를 따로따로 하지 않아도 되지 않을까?」라고 하는 지적을 받아 테이블 구조를 바꾸었습니다. 그래서, 예로서는 조금 부적절할지도 모릅니다만 용서를.

모델 연관



user.rb
class User < ApplicationRecord
  has_many :tag_users
  has_many :tags, through: :tag_users
  has_many :tag_settings
end

tag_user.rb
class TagUser < ApplicationRecord
  belongs_to :user
  belongs_to :tag
  belongs_to :tag_setting
end

tag_setting.rb
class TagSetting < ApplicationRecord
  has_one :tag_user
  has_one :tag, through: :tag_user
  belongs_to :user
end

tag.rb
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_usershas_many 의 때는 :through 도 복수형
has_one :tag, through: :tag_userhas_one 때는 :through 도 단수형

링크


  • Active Record 연결 - Rails 가이드
  • 좋은 웹페이지 즐겨찾기