[Rails] 다형성 중간 테이블에 through 관련 정의

rails에서 폴리모픽 관련 중간 테이블에 through를 정의하는 방법을 조사했기 때문에 망비록입니다. 편리하지만 너무 정보가 떨어지지 않습니다.

설명/해제


  • 설명하기
    Rails의 ActiveRecord에 있어서, 폴리모픽 관련이 정의되고 있는 중간 테이블이 있는 경우의 through의 정의 방법.
  • 설명하지 않는 것
    폴리모픽 관련 및 through 관련 상세 설명.

  • 일반 through 연관



    다음과 같은 관계가 각 모델에 있다고 가정합니다.


    company는 복수의 event를 주최할 수 있고, 복수의 company가 공동으로 event를 주최할 수 있습니다. 이 경우 다음과 같은 연관을 정의합니다.

    model.rb
    class Company < ApplicationRecord
      has_many :event_owners
      has_many :events, through: :event_owners
    end
    
    class EventOwners < ApplicationRecord
      belongs_to :company
      belongs_to :event
    end
    
    class Event < ApplicationRecord
      has_many :event_owners
      has_many :companies, through: :event_owners
    end
    

    그런 다음 EventOwner를 통해 evet에 연결하는 여러 company를 다음과 같이 얻을 수 있습니다.
    > event.companies
    => # [company1, company2]
    

    자, 여기까지는 아는 대로입니다.

    다형성 관련 through 관련



    그럼 여기서 comapny 외에 일반 user도 이벤트를 개최할 수 있게 된 경우를 생각해 보겠습니다. 관련 다이어그램은 다음과 같습니다.


    자, 이제 다형성 관련을 정의해 봅시다.

    model.rb
    class Company < ApplicationRecord
      has_many :event_owners, as: :eventable
      has_many :events, through: :event_owners
    end
    
    class User < ApplicationRecord
      has_many :event_owners, as: :eventable
      has_many :events, through: :event_owners
    end
    
    class EventOwners < ApplicationRecord
      belongs_to :event
      belongs_to :eventable, polymorphic: true # ポリモーフィック関連
    end
    
    class Event < ApplicationRecord
      has_many :event_owners
     # 以下がポリモーフィックなthrough関連
      has_many :companies, through: :event_owners, source: :eventable, source_type: 'Company'
      has_many :users, through: :event_owners, source: :eventable, source_type: 'User'
    end
    

    through 관련으로 source 를 정의하는 것으로, 이하와 같이 event 에 관련하는 user or company 를 취득할 수가 있습니다.
    > event.companies # or event.users
    => # [company1, company2]
    

    조금 전까지 몰랐지만 굉장히 편리!

    좋은 웹페이지 즐겨찾기