2012-02-28 66 views
53

我正在使用rails ransack(https://github.com/ernie/ransack)允許用戶篩選和排序某些記錄。我使用傳統方法得到過濾和排序的記錄。從ActiveRecord範圍刪除訂單

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

現在我想獲得一些概要信息,所以我有

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

除了當用戶指定一個字段進行排序。我收到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 

我可以從範圍中刪除排序嗎?怎麼樣?

感謝

+0

嗯現在洗劫不順心的選擇對結果集,不知道它的工作沒有那種問題了。 – jrhicks 2012-02-28 23:57:06

回答

125

可以調用reorder方法用一個空字符串。例如: -

[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

注意:如果你覺得更好,也可以調用'.reorder(nil)'。 – pdobb 2016-11-13 18:22:41

+5

另一種選擇是使用'unscope(:order)' – Rene 2017-06-13 16:48:07

-3

您還可以使用unscoped類方法的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 

在Rails 2,它被稱爲with_exclusive_scope

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

+23

對使用​​'unscoped'的人發出警告:它不僅僅是重置訂單!如果您在鏈接的ActiveRecord查詢中使用它,它將有效地從考慮中刪除先前的約束條件。 例如,'Posts.first.comments.unscoped'將返回所有評論,而不僅僅是那些與第一篇文章相關的評論。 – 2013-09-12 20:34:22