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.
Grazie! E 'stato così facile. Questo e 'esattamente quello che stavo cercando. – Ryan
D'accordo, questo è stato un vero toccasana. Mai sentito parlare di riordino fino ad ora. – natebeaty
Consentitemi di terzo! Ho cambiato l'ordine in un riordino nella mia portata nominata e ha funzionato come un fascino. –