Rails 4 a introduit un avertissement de dépréciation 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?
L’option uniq
doit être déplacée dans un bloc d’étendue. Notez que le bloc de scope doit être le deuxième paramètre de has_many
(c.-à-d. has_many
vous ne pouvez pas le laisser à la fin de la ligne, il doit être déplacé avant la partie :through => :donations
):
has_many :donors, -> { uniq }, :through => :donations
Cela peut sembler étrange, mais cela prend un peu plus de sens si vous considérez le cas où vous avez plusieurs parameters. 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
En plus de la réponse de Dylans, si vous étendez l’association avec un module, assurez-vous de la chaîner dans le bloc de scope (plutôt que de le spécifier séparément), comme ceci:
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 d’étendue pour étendre un proxy d’association.