Предупреждение о устаревании при использовании has_many: через: uniq in Rails 4

Rails 4 внедрил предупреждение об устаревании при использовании: uniq = > true с has_many: through. Например:

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 объявление?

Ответ 1

Параметр 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

Ответ 2

В дополнение к ответу Dylans, если вы, вероятно, расширяете связь с модулем, убедитесь, что вы привязываете его в блоке области (в отличие от его указания отдельно), например:

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

Возможно, это только я, но кажется очень неинтуитивным использовать блок видимости для расширения прокси-сервера ассоциации.