12

Quindi in pratica ho due classi, Prenota e Autore. I libri possono avere più autori e autori possono avere più libri. I libri hanno il seguente ambito di default.Ignora solo l'ambito predefinito (in particolare l'ordine) e nient'altro in Rails

default_scope :order => "publish_at DESC" 

Nella pagina Autore spettacolo voglio elencare tutti i libri associati a tale autore così ho dire quanto segue ...

@author = Author.find(params[:id]) 
@books = @author.books 

Tutto è bene finora. L'autore # mostra la pagina elenca tutti i libri appartenenti all'autore ordinato per data di pubblicazione.

Sto anche lavorando a un gioiello che è in grado di ordinare in base alla popolarità di un libro.

@books = @author.books.sort_by_popularity 

Il problema è che ogni volta che tenta di ordinare, il default_scope interferisce sempre. E se provo a decifrarlo prima che si sbarazzi della relazione dell'autore e restituisca ogni libro nel database. Per esempio

@books = @author.books.unscoped.sort_by_popularity # returns all books in database 

Mi chiedo se posso usare il ActiveRelation except() method a fare qualcosa del genere (che sembra come esso dovrebbe funzionare ma non è così. Si ignora ordine, non solo quando si tratta di un ordine default_scope)

def sort_by_popularity 
    self.except(:order).do_some_joining_magic.order('popularity ASC') 
    # |------------|      |---------------------| 
end 

Qualche idea sul perché questo non funziona? Qualche idea su come farlo funzionare in modo diverso? So che posso semplicemente sbarazzarmi di default_scope ma mi chiedo se ci sia un altro modo per farlo.

risposta

28

Si dovrebbe essere in grado di utilizzare reorder di sostituire completamente l'ordine esistente BY:

di riordino (* args)
sostituisce ogni ordine esistente definita sul rapporto con l'ordine specificato.

Quindi qualcosa di simile:

def self.sort_by_popularity 
    scoped.do_some_joining_magic.reorder('popularity ASC') 
end 

e penso che si desidera utilizzare un metodo di classe per questo e scoped invece di self ma non so l'intero contesto così forse mi sbaglio .

Non so perché except non funziona. Il default_scope sembra essere applicato alla fine (una sorta di) piuttosto che all'inizio, ma non ho esaminato così tanto.

+0

Grazie! E 'stato così facile. Questo e 'esattamente quello che stavo cercando. – Ryan

+1

D'accordo, questo è stato un vero toccasana. Mai sentito parlare di riordino fino ad ora. – natebeaty

+0

Consentitemi di terzo! Ho cambiato l'ordine in un riordino nella mia portata nominata e ha funzionato come un fascino. –

Problemi correlati