2017-07-07 17 views
0

です。私はRansackでRails 5を使用しています。ステータスは0〜5の整数です。私は0の最後の(1、2、3、4、5、0)のステータスを除いて、昇順であるこの列の既定の順序を作成しようとしています。Rails 5ではRansackを使用しています。ソートのカスタムスコープは

私は、ステータス== 0オブジェクトずに昇順でオブジェクトを取得することができています:

scope :asc_no_approved, lambda { where.not(status: [0]).order('status ASC') } 

としてステータス== 0オブジェクト:

scope :approved, lambda { where(status: [0]) } 

がありますこの2番目のスコープを最初の最後に追加する方法は?

scope :asc_approved_last, lambda { where.not(status: [0]).order('status ASC').where(status: [0]) } 

をしかし、それは、次のMySQLで何のオブジェクトを返しません:私が試した他の誰が解決しようとしている場合は、以下のコメントは、やや混乱しているので

:UPDATE

SELECT `requests`.* FROM `requests` WHERE (`requests`.`status` != 0) AND `requests`.`status` = 0 ORDER BY status ASC LIMIT 10 OFFSET 0 

これは私のために働いたものです。受け入れ答えあたりとして、これらは私のスコープです:

scope :asc_no_approved, lambda { where.not(status: [0]).order('status ASC') } 
scope :approved, lambda { where(status: [0]) } 
scope :asc_approved_last, lambda { asc_no_approved + approved } 

そして、ここでは、コントローラの私の呼び出しです:

@requests = Kaminari.paginate_array(@q.result.includes(:employee, :user, :title).asc_approved_last).limit(10).page(params[:page]) 

答えて

1

あなたは、あなたもちょうどasc_no_approved.approvedを一緒に微細なようなチェーンスコープを行うことができますすることができますが、私はゼロのオブジェクトを返す理由は、ステータスが0でないすべてのものを探していて、そのステータスが0であるこのコレクションのものを要求しているからだと思う。

WHERE (`requests`.`status` != 0) AND `requests`.`status` = 0 

approvedの結果を文字通りasc_no_approvedに追加したい場合は、approved + asc_no_approved

+0

これは理にかなっています。スコープ内にあるので、メソッドで 'approved + asc_no_approved'を行うのが最善でしょうか? – Chase

+0

私は実際にはコードスタイルでは最高ですが、スコープは本質的にクラスメソッドなので、2つのコレクションを一緒に追加したり、同じことをするクラスメソッドを持つ別のスコープを持つことができます。私はおそらく、物事をより明瞭に保つために範囲に入るだろうか? –

+0

私はそれらを一緒に連鎖すると 'scope:asc_approved_last、lambda {asc_no_approved.approved}'私はそれが0個のオブジェクトを返すところで同じMySQL呼び出しを取得し、そういうものを追加しようとすると 'scope:asc_approved_last、lambda {asc_no_approved + approved} '#のページ定義で' undefined method 'page 'というエラーが表示されます。どうして私がページネーションを使用させないのか分かりません。スコープの1つだけを使用すると、それはまだ動作します。 – Chase

関連する問題