92

Rails 4 ha introdotto un avviso di deprecazione quando si utilizza: uniq => true con has_many: through. Per esempio:Avviso di deprecazione quando si utilizza has_many: through: uniq in Rails 4

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

rese il seguente avviso:

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' 

Qual è il modo corretto per riscrivere la dichiarazione has_many di cui sopra?

risposta

230

L'opzione uniq deve essere spostata in un blocco di ambito. Si noti che il blocco ambito deve essere il secondo parametro di has_many (cioè non si può lasciare alla fine della linea, deve essere spostato prima della parte :through => :donations):

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

Può sembrare strano , ma ha un po 'più senso se si considera il caso in cui si hanno più parametri. Ad esempio, questo:

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

diventa:

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

Grazie, funziona benissimo! dove lo hai trovato? Non sono stato in grado di trovarlo nella documentazione ovunque. – mysmallidea

+6

L'ho visto nel libro Upgrade to Rails 4 (è in corso): http://www.upgradingtorails4.com/ - non sono stato in grado di trovarlo da nessun'altra parte. –

+2

Difficile trovare una risposta così concisa. Signore, meriti più voti. – courtsimas

5

Oltre a Dylans risposta, se vi capita di estendere l'associazione con un modulo, assicurarsi che si concatenano nel blocco portata (al contrario di specificando separatamente), in questo modo:

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

Forse è solo me, ma sembra molto intuitivo da usare un blocco di ambito per estendere un proxy associazione.

Problemi correlati