Rails 4에서 has_many : through : uniq 사용시 사용 중단 경고


95

Rails 4는 has_many : through와 함께 : uniq => true를 사용할 때 사용 중단 경고를 도입했습니다. 예를 들면 :

has_many :donors, :through => :donations, :uniq => true

다음 경고를 표시합니다.

DEPRECATION WARNING: The following options in your Goal.has_many :donors declaration are deprecated: :uniq. Please use a scope block instead. For example, the following:

    has_many :spam_comments, conditions: { spam: true }, class_name: 'Comment'

should be rewritten as the following:

    has_many :spam_comments, -> { where spam: true }, class_name: 'Comment'

위의 has_many 선언을 다시 작성하는 올바른 방법은 무엇입니까?

답변:


237

uniq옵션은 범위의 블록으로 이동해야합니다. 스코프 블록은 다음의 두 번째 매개 변수 여야합니다 has_many(즉, 줄 끝에 둘 수 없으며 :through => :donations부품 앞으로 이동해야 함 ).

has_many :donors, -> { uniq }, :through => :donations

이상하게 보일 수 있지만 여러 매개 변수가있는 경우를 고려하면 조금 더 의미가 있습니다. 예를 들면 다음과 같습니다.

has_many :donors, :through => :donations, :uniq => true, :order => "name", :conditions => "age < 30"

된다 :

has_many :donors, -> { where("age < 30").order("name").uniq }, :through => :donations

감사합니다. 잘 작동합니다! 이걸 어디서 찾았 어? 나는 문서 어디에서도 찾을 수 없었습니다.
Ryan Crispin Heneise 2013 년

6
실제로 Upgrading to Rails 4 책 (진행 중)에서 봤습니다 : upgradetorails4.com- 다른 곳에서는 찾을 수 없었습니다.
Dylan Markow

1
@DylanMarkow Rails 4로 업그레이드하기위한 링크가 없습니다. 이 책은 이제 github.com/alindeman/upgradingtorails4
Ivar

1
레일 (5) 사용으로 distinct대신 uniq. 자세한 내용은 이 답변 을 참조하십시오.
Nic Nilov

5

Dylans 답변 외에도 모듈과의 연결을 확장하는 경우 다음과 같이 스코프 블록에 연결해야합니다 (별도로 지정하는 것이 아님).

has_many :donors,
  -> { extending(DonorExtensions).order(:name).uniq },
  through: :donations

나뿐 일 수도 있지만 범위 블록을 사용하여 연결 프록시를 확장하는 것은 매우 직관적이지 않은 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.