[ruby-on-rails] Rails 4에서 has_many : through : uniq 사용시 사용 중단 경고

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

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


답변