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
레코드에서 연관을 따라 가면 관련 모델이 조인 모델의 속성을 갖는 것처럼 처리 할 수 있습니다.
참고 자료
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 は省略
user.profile_images.first.order
user.images.first.src
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"를 참조하십시오 Reference
이 문제에 관하여(has_many :through의 결합 모델의 속성을 관련 모델의 속성으로서 취득한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kymmt90/items/fb06b4cdcc9ed0d5b2b8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)