2012-02-28 11 views
53

Estoy usando rails ransack (https://github.com/ernie/ransack) para permitir a los usuarios filtrar y ordenar algunos registros. Obtengo los registros filtrados y ordenados usando métodos tradicionales.Eliminar orden de ActiveRecord scope

@invoices = Invoice.search(params[:q]).result 

Ahora me gustaría obtener alguna información resumida así que tengo

@invoices = Invoice.search(params[:q]).result 
@summary = @invoices.select("sum(balance) as balance_total").first 

Excepto cuando el usuario especifica un campo para ordenar. Obtengo el error de SQL:

Column "project_name" is invalid in the ORDER BY clause because 
it is not contained in either an aggregate function or the GROUP BY clause 

¿Puedo eliminar el género del alcance? ¿Cómo?

Gracias

+0

hmmm ahora saquear no le gustaba la selección en el conjunto de resultados, no estoy seguro que funcionaba sin el problema especie más. – jrhicks

Respuesta

125

puede llamar al método reorder con una cadena vacía. Ej .:

[1] pry(main)> Article.order('headline asc').to_sql 
=> "SELECT `articles`.* FROM `articles` ORDER BY headline asc" 
[2] pry(main)> Article.order('headline asc').reorder('').to_sql 
=> "SELECT `articles`.* FROM `articles` " 
+8

Nota: Si se siente mejor para usted, también puede llamar a '.reorder (nil)'. – pdobb

+5

Otra opción es usar 'unscope (: orden)' – Rene

-3

También puede utilizar el método de la clase unscoped en Rails 3:

class Post < ActiveRecord::Base 
    default_scope :published => true 
end 

posts = Post.all #=> SELECT * FROM posts WHERE published = true 

posts = Post.unscoped do 
    Post.all #=> SELECT * FROM posts 
end 

En Rails 2 se llamaba with_exclusive_scope.

Ver https://github.com/rails/rails/commit/bd1666ad1de88598ed6f04ceffb8488a77be4385

+23

Una palabra de advertencia para las personas que usan 'unscoped': ¡hace más que simplemente restablecer el orden! Si lo está utilizando en una consulta encadenada de ActiveRecord, eliminará efectivamente las restricciones anteriores de la consideración. Por ejemplo, 'Posts.first.comments.unscoped' devolverá TODOS los comentarios, no solo los asociados con la primera publicación. –