2016-10-03 14 views
0

has_many間隔の部屋モデルがあります。 Intervalsにはstart_date属性とend_date属性があります。私は複数のサブモデルの状態/状態に基づいた並べ替え

の1-ルーム start_dateの持つ任意の間隔(S)との2 - ルーム> Date.today を持つ任意の間隔なし、3-ルームSTART_DATE> Date.todyなし間隔をおいて、次の条件に基づいて、部屋を注文したいです

私はルームを並べ替えると、1つの部屋が最初に来て、次に2つ目と3つの部屋がモデルのメソッドではなく、postgresqlクエリを使って並べ替えるようにしたいと思います。私は何の問題が出て見つけていない持っているが

がどの部屋

joins("LEFT OUTER JOIN intervals ON rooms.id = intervals.room_id").where("intervals.id is NULL") 

私は、単一のクエリで3つの条件によって発注の問題が生じています下のクエリ/スコープを使用して何の間隔を持っていない、私は次の

を試してみました
Room.joins("LEFT OUTER JOIN intervals ON rooms.id = intervals.room_id").order("CASE WHEN intervals.id IS NULL THEN 1 END ASC") 

このクエリの問題は、エラーがPG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select listと表示され、ここで別名を呼び出しても正常に動作する場合でも、最初の1つの条件でソートされているということです。

私の考えは、3つの条件に基づいて生成された列の値を与え、最初に値1、2番目の値2、3番目の値3を与え、この計算された値で並べ替えるという条件付きの関数を生成することです、私はそれを試すたびに、私は上記のエラーに襲われる。どんな助けもありがとう。

これは、すべての3つの条件を組み合わせることが、私の裁判です:

Room.joins("LEFT OUTER JOIN intervals ON rooms.id = intervals.room_id").group("room.id").order("CASE WHEN room.id IS NULL THEN 1 WHEN COUNT(CASE WHEN intervals.start_date > '#{Date.today.to_s(:db)}' THEN 1 END) > 0 THEN 2 WHEN COUNT(CASE WHEN intervals.start_date > '#{Date.today.to_s(:db)}' THEN 1 END) = 0 THEN 3 END") 

しかしこれはエラーを与える:PG :: GroupingErrorを:ERROR:コラム "intervals.idは、" GROUP BY句に現れなければならないか、使用すること集計関数

何か助けていただければ幸いです。

答えて

1

この「特定の」ケースでは、特定のビジネスルールのスキーマを標準化解除します。覚えておいてください。ある時点でおそらくページネーションが必要となり、dbで注文する必要があります。この効果に

、私は、ソートの優先順位を示すために、あなたのモデルに列を追加します。

add_column :rooms, :sort_priority, :integer, null: false, default: 0 

その後の間隔のための私のモデルでは、私は優先順位に

before_save -> { 
    if (start_date < blah blah blah) 
    self.priority = 1 
    elsif (blah blah) 
    etc... 
    end 
} 
を設定しますbefore_saveフィルターが含まれるであろう

その後、私は私の参照ここ

class Room 
    has_many :intervals, -> {order :priority, :start_date} 
end 
+1

他の部分でこれを反映するには、cronのjを追加することになります時間の経過に基づいて何かを引き起こすことができないため、毎日の始まりに各部屋の優先順位を更新するようにしてください。私は答えと一緒にこれが完全な正しい結果であると信じています – Thresh

関連する問題