95 votes

Avertissement de dépréciation lors de l'utilisation de has_many: via: uniq dans Rails 4

Rails 4 a introduit un avertissement de désapprobation lors de l'utilisation de: uniq => true avec has_many: through. Par exemple:

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

Donne l'avertissement suivant:

 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'
 

Quelle est la bonne façon de réécrire la déclaration has_many ci-dessus?

236voto

Dylan Markow Points 65796

L' uniq option doit être déplacé dans un champ de bloc. Notez que le champ d'application de bloc doit être le deuxième paramètre has_many (c'est à dire que vous ne pouvez pas le quitter à la fin de la ligne, il doit être déplacé avant l' :through => :donations partie):

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

Il peut paraître étrange, mais il fait un peu plus de sens si l'on considère le cas où vous avez de multiples paramètres. Par exemple, ceci:

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

devient:

has_many :donors, -> { where("age < 30").order("name").uniq }, :through => :donations

5voto

Andrew Hacking Points 2348

En plus de la réponse de Dylans, si vous étendez l'association avec un module, assurez-vous de l'enchaîner dans le bloc scope (au lieu de le spécifier séparément), comme suit:

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

Peut-être que c'est juste moi, mais il semble très peu intuitif d'utiliser un bloc de portée pour étendre un proxy d'association.

1voto

galatians Points 126

Cette variation mineure fonctionne également dans Rails 4.

 class Relationship < ActiveRecord::Base
  belongs_to :entry
  belongs_to :tag

  validates :tag, uniqueness: {scope: :entry}
end
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X