has_many :through의 결합 모델의 속성을 관련 모델의 속성으로서 취득한다

4269 단어 RailsActiveRecord

할 일



한 사용자가 이미지 그룹 중에서 여러 장을 선택하여 프로필 이미지로 설정할 수 있는 다음 테이블이 있다고 가정합니다. 특징으로는 조인 모델 profile_images에 외래 키 이외의 속성 order가 있는 것을 들 수 있습니다.



이것을 Active Record로 작성하면 다음과 같습니다.
class User < ApplicationRecord
  has_many :profile_images
  has_many :images, through: :profile_images
end

class ProfileImage < ApplicationRecord
  belongs_to :users
  belongs_to :images
end

# Image は省略

이 때, 결합 모델 ProfileImage 의 속성 order 를 취득하는 경우와, 관련처의 모델 Image 의 속성 src 를 취득하는 경우와, 다음과 같이 구분하지 않으면 안됩니다.
user.profile_images.first.order
user.images.first.src

기술을 통일시키기 위해서, User 의 레코드로부터 관련처 Image 를 따르는 경우는, 다음과 같이 ProfileImage 의 속성도 Image 의 속성도 통일한 형태로 취득할 수 있도록(듯이) 합니다.
user.ordered_images.first.order # User からたどると Image から ProfileImage#order を参照できる
user.ordered_images.first.src

하는 방법


has_many 의 제 2 인수 ( scope ) 에 다음과 같은 람다 식을 건네줍니다. 이 인수는 관련처를 취득할 때에 사용하는 쿼리를 커스터마이즈 하기 위해서 사용합니다.
class User < ApplicationController
  has_many :ordered_images,
           ->{ select("#{Image.table_name}.*", "#{ProfileImage.table_name}.order AS order") },
           through: :profile_images,
           class_name: 'Image'
end

※주의: 여기에서는 보통 관련과 구별하기 위해 ordered_images 라는 이름으로 하고 있습니다. 또, 이 방법을 사용하면(자), user.ordered_images.count 와 같은 집계 조작은 쿼리를 잘 생성할 수 없어 에러가 됩니다.

여기서는 users , profile_images 에 덧붙여 images 를 맞추어 SELECT 하도록(듯이) 하고 있습니다.

이제 Image 와 같이 select 레코드에서 연관을 따라 가면 관련 모델이 조인 모델의 속성을 갖는 것처럼 처리 할 수 ​​있습니다.

참고 자료



  • 이미지
  • ProfileImage.order의 설명에서 "Scopes"를 참조하십시오

  • 좋은 웹페이지 즐겨찾기