Предупреждение о устаревании при использовании 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
Возможно, это только я, но кажется очень неинтуитивным использовать блок видимости для расширения прокси-сервера ассоциации.