Попередження про припинення використання при використанні has_many: through: uniq у Rails 4


95

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?

Відповіді:


237

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

Дякую, це чудово працює! Де ти це знайшов? Я ніде не зміг знайти його в документації.
Райан Кріспін Хейніз,

6
Я насправді бачив це в книзі Upgrading to Rails 4 (вона триває): upgradingtorails4.com - ніде більше не міг її знайти.
Ділан Маркоу

1
@DylanMarkow посилання для оновлення до Rails 4 не існує. Зараз книга вийшла під ліцензією CC за адресою github.com/alindeman/upgradingtorails4
Івар,

1
З Rails 5 використовуйте distinctзамість uniq. Докладніше див. У цій відповіді .
Nic Nilov

5

На додаток до відповіді Dylans, якщо ви випадково розширюєте асоціацію з модулем, переконайтеся, що ви прив’язали його до блоку області (на відміну від вказування окремо), наприклад:

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

Можливо, це лише я, але здається дуже неінтуїтивним використання блоку області для розширення проксі-асоціації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.