2012-02-28 16 views
53

Używam systemu ransack (https://github.com/ernie/ransack), aby umożliwić użytkownikom filtrowanie i sortowanie niektórych rekordów. Dostaję przefiltrowane i posortowane rekordy przy użyciu tradycyjnych metod.Usuń zamówienie z zakresu ActiveRecord

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

Teraz chciałbym uzyskać pewne informacje podsumowujące więc mam

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

wyjątkiem sytuacji, gdy użytkownik określa pole do sortowania. Otrzymałem błąd 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 

Czy mogę usunąć sortowanie z zakresu? W jaki sposób?

Dzięki

+0

hmmm teraz ransack nie lubić select na tabeli wynikowej, nie wiedząc, że pracował bez problemu sortowania więcej. – jrhicks

Odpowiedz

125

można wywołać metodę reorder z pustym ciągiem. Np .:

[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

Uwaga: Jeśli czujesz się lepiej dla ciebie, możesz również wywołać '.reorder (zero)'. – pdobb

+5

Inną opcją jest użycie 'unscope (: order)' – Rene

-3

Można również użyć metody klasy unscoped w 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 

W Rails 2 nazwano with_exclusive_scope.

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

+23

Słowo ostrzeżenia dla osób używających 'unscoped': To więcej niż tylko resetowanie zamówienia! Jeśli używasz go w kwantowej kwerendzie ActiveRecord, to skutecznie usunie wcześniejsze ograniczenia z rozważań. Na przykład "Posts.first.comments.unscoped" zwróci WSZYSTKIE komentarze, nie tylko te powiązane z pierwszym wpisem. –