3

したがって、いくつかのレコードを返すアクティブなレコード クエリがあります。たとえば、次のようになります。

jobs = Job.where(:user_id => current_user.id)

ご想像のとおり、これは current_user のジョブを返します。仕事に 2 つの日付があるdeadline_dateとしdue_dateます。注文したい場合は、次deadline_dateのようなことができます..

jobs.order("deadline_date asc")

これは期待どおりに機能します。ジョブ モデルにこのようなものがあることをイメージしてください。

class Job < ActiveRecord::Base
 def deadline_date
  self.read_attribute(:deadline_date) || self.due_date
 end
end

deadline_dateそのため、 nil でない場合はジョブが表示され、それ以外の場合はフォールバックしてdue_date. これをソートするために、次のことを行いました...

jobs.sort_by{|job| job.deadline_date}
jobs.sort_by{|job| job.deadline_date}.reverse

これは私の問題を解決しますが、より良い代替手段があるのではないかと思いました.SQLを使用してこれを達成することは可能ですか? sort_orderまた、これは、このように直接渡すことができる変数をコントローラーに持っているという点で、いくつかの繰り返しコードを生成します...

jobs.order(sort_order)

今はもっとこのように見えます...

if params[:sort] == "deadline_date"
 if params[:order] == "asc"
  jobs.sort_by{|job| job.deadline_date}
 else
  jobs.sort_by{|job| job.deadline_date}.reverse
 end
else
 jobs.order(sort_order)
end

注:これは実際には任意の例であり、少し面倒ですが、アイデアは得られます. そこで、SQL の代替案や改善方法についての提案を探しています。乾杯

4

1 に答える 1

20

COALESCE私があなたを正しく理解していれば、 SQL 関数を使用してこれを行うことができるはずです。

jobs.order(Arel.sql("COALESCE(deadline_date, due_date)"))

deadline_date || due_dateそれはRubyとほぼ同じです。

私はそれが標準の SQL であると信じているので、ほとんどの SQL ダイアレクトで機能するはずです。

于 2013-10-29T14:05:17.587 に答える