Avviso di deprecazione quando si utilizza has_many: through: uniq in Rails 4


95

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

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

Produce 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?

Risposte:


237

L' uniqopzione deve essere spostata in un blocco di ambito. Nota che il blocco dell'ambito deve essere il secondo parametro a has_many(cioè non puoi lasciarlo alla fine della riga, deve essere spostato prima della :through => :donationsparte):

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

Può sembrare strano, ma ha un po 'più senso se consideri il caso in cui hai 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

Grazie, funziona benissimo! dove lo hai trovato? Non sono riuscito a trovarlo da nessuna parte nella documentazione.
Ryan Crispin Heneise

6
In realtà l'ho visto nel libro Upgrading to Rails 4 (è in corso): upgradetorails4.com - non sono riuscito a trovarlo da nessun'altra parte.
Dylan Markow

1
@DylanMarkow il collegamento per l'aggiornamento a Rails 4 è defunto. Il libro è stato ora pubblicato con licenza CC su github.com/alindeman/upgradingtorails4
Ivar

1
Con Rails 5 usa distinctinvece di uniq. Vedi questa risposta per maggiori dettagli.
Nic Nilov

5

Oltre alla risposta di Dylans, se ti capita di estendere l'associazione con un modulo, assicurati di concatenarlo nel blocco dell'ambito (invece di specificarlo separatamente), in questo modo:

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

Forse sono solo io, ma non sembra molto intuitivo utilizzare un blocco di ambito per estendere un proxy di associazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.