Вопрос по rails-activerecord, activerecord, ruby-on-rails-4, ruby-on-rails – Предупреждение об устаревании при использовании has_many: through: uniq в Rails 4

95

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

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?

Ваш Ответ

2   ответа
235

uniq Опция должна быть перемещена в область видимости. Обратите внимание, что блок области видимости должен быть вторым параметромhas_many (то есть вы можете 'не оставлять его в конце строки, его нужно переместить до того, как:through =>  часть):

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

Это может выглядеть странно, но это имеет немного больше смысла, если вы рассматриваете случай, когда у вас есть несколько параметров. Например, это:

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

будет выглядеть так:

has_many :donors, -> { where("age < 30").order("name").uniq }, :through => 
Я на самом деле видел это в книге Upgrading to Rails 4в процессе):upgradingtorails4.com - гаваньне смог найти его где-нибудь еще. Dylan Markow
@DylanMarkow ссылка на Обновление до Rails 4 больше не существует. Книга была выпущена под лицензией CC наgithub.com/alindeman/upgradingtorails4 Ivar
С использованием Rails 5distinct вместоuniq, Увидетьэтот ответ Больше подробностей. Nic Nilov
Спасибо, это прекрасно работает! Где ты нашел это? У меня нетя не смог найти его в документации где угодно. BoosterStage
5

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

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

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

Похожие вопросы