La advertencia de obsolescencia cuando se usa tiene muchos: a través de: uniq en Rails 4


Rails 4 ha introducido una advertencia de obsolescencia cuando se usa :uniq => true con has_many :through. Por ejemplo:

has_many :donors, :through => :donations, :uniq => true

Produce la siguiente advertencia:

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'

¿Cuál es la forma correcta de reescribir la declaración has_many anterior?

Author: BoosterStage, 2013-05-15

2 answers

La opción uniq necesita ser movida a un bloque de ámbito. Tenga en cuenta que el bloque de ámbito debe ser el segundo parámetro de has_many (es decir, no puede dejarlo al final de la línea, debe moverse antes de la parte :through => :donations):

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

Puede parecer extraño, pero tiene un poco más de sentido si considera el caso en el que tiene múltiples parámetros. Por ejemplo, esto:

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

Se convierte en:

has_many :donors, -> { where("age < 30").order("name").uniq }, :through => :donations
 235
Author: Dylan Markow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-22 21:45:13

Además de la respuesta de Dylans, si está extendiendo la asociación con un módulo, asegúrese de encadenarlo en el bloque de ámbito (en lugar de especificarlo por separado), de la siguiente manera:

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

Tal vez sea solo yo, pero parece muy poco intuitivo usar un bloque de ámbito para extender un proxy de asociación.

 5
Author: Andrew Hacking,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-27 05:58:05