2012-02-28 7 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

答えて

125

あなたは空の文字列でreorderメソッドを呼び出すことができます。それはwith_exclusive_scopeと呼ばれていたのRails 2では

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 

:例えば:

[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

+5

別のオプションは、 'unscope(:order)'を使うことです。 – Rene

-3

また、Railsの3でunscopedクラスのメソッドを使用することができます。

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

+23

'unscoped'を使っている人に警告する言葉です。連鎖ActiveRecord問合せで使用している場合は、以前の制約を考慮から効果的に削除します。 たとえば、「Posts.first.comments.unscoped」は、最初の投稿に関連付けられたコメントだけでなく、すべてのコメントを返します。 –

関連する問題