12

Así que, básicamente, tengo dos clases, libro y Autor. Los libros pueden tener varios autores y los autores pueden tener varios libros. Los libros tienen el siguiente alcance predeterminado.de anulación sólo el ámbito predeterminado (en concreto orden) y nada más en Rails

default_scope :order => "publish_at DESC" 

En la página Autor espectáculo Quiero que todos los libros asociados a ese autor, así que decir lo siguiente ...

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

Todo está bien hasta ahora. La página del autor # show enumera todos los libros pertenecientes a ese autor ordenados por fecha de publicación.

También estoy trabajando en una joya que es capaz de clasificar por la popularidad de un libro.

@books = @author.books.sort_by_popularity 

El problema es que cada vez que trata de ordenar, el default_scope siempre se interpone en el camino. Y si trato de desvelarlo antes, se eliminará la relación del autor y se devolverán todos los libros en la base de datos. Por ejemplo

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

Me pregunto si puedo utilizar el ActiveRelation except() method a hacer algo como esto (que parece que debería funcionar, pero no es así. No tiene en cuenta el orden, pero no cuando se trata de una orden default_scope)

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

¿Alguna idea de por qué esto no funciona? ¿Alguna idea sobre cómo hacer que esto funcione de una manera diferente? Sé que puedo deshacerme del default_scope, pero me pregunto si existe otra forma de hacerlo.

Respuesta

28

Usted debe ser capaz de utilizar reorder para reemplazar completamente el orden existente POR:

de reordenación (* args)
reemplaza cualquier orden existente definido en la relación con el orden especificado.

Así que algo como esto:

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

y creo que se desea utilizar un método de clase para eso y scoped en lugar de self pero no saben todo el contexto así que tal vez estoy equivocado .

No sé por qué except no funciona. El default_scope parece aplicarse al final (más o menos) en lugar de al principio, pero no lo he investigado tanto.

+0

¡Gracias! Eso fue tan fácil. Esto es exactamente lo que estaba buscando. – Ryan

+1

De acuerdo, esto fue un salvavidas. Nunca escuché de reordenar hasta ahora. – natebeaty

+0

¡Permítame ser el tercero! Cambié el orden a un nuevo pedido en mi alcance nombrado y funcionó como un amuleto. –

Cuestiones relacionadas