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 선언을 다시 작성하는 올바른 방법은 무엇입니까?
답변
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
답변
Dylans 답변 외에도 모듈과의 연결을 확장하는 경우 다음과 같이 스코프 블록에 연결해야합니다 (별도로 지정하는 것이 아님).
has_many :donors,
-> { extending(DonorExtensions).order(:name).uniq },
through: :donations
나뿐 일 수도 있지만 범위 블록을 사용하여 연결 프록시를 확장하는 것은 매우 직관적이지 않은 것 같습니다.