2017-09-02 16 views
0

誰でも次のSQL文をRailsに書き込む方法を理解できますか?Rails Activerecord Relation:サブクエリをSQLジョインのテーブルとして使用する

SELECT * FROM shifts a 
INNER JOIN (
    SELECT shifts.date, shifts.time, max(shifts.barber_id) as 'barber_id' 
    FROM shifts 
    WHERE shifts.date = '2017-09-06' and shifts.is_free = true 
    GROUP BY shifts.date, shifts.time 
) b 
ON a.date = b.date AND a.time = b.time AND a.barber_id = b.barber_id 
WHERE a.`is_free` = true AND a.date = '2017-09-06' 

どこ-条件は、私は次のようにスコープを使用していサブクエリとメイン・クエリで同じなので:

scope :grouped_shifts, -> { select("date, time, max(barber_id) as barber_id").group(:date, :time).available } 
:私もサブクエリのスコープを作成しました

scope :available, -> { where('shifts.is_free', true).where('shifts.date', '2017-09-06').order(date: :desc, time: :asc) } 

しかし、私はメソッドを結合するスコープをチェーンする方法を見つけることができません。それを議論として渡すことはできますか?このようなスコープは使用しないでください:

scope :something, -> { joins(self.grouped_shifts).available } 

事前にお世話になりました!あなたは、あなたの質問にし、あなたの質問にあなたの最初のコメントで言ったこと一緒に組み合せる

+0

SQLを見ると、クエリ全体の結果がどのような結果になるかはわかりません内側のクエリ私のテーブルの –

+0

私は同じ日付と時間で、しかし異なるbarber_idフィールドを持ついくつかのレコードを持っています。私がしようとしているのは、テーブルをフィルタリングし、日付と時刻の各グループでbarber_idの最大値を持つ行のみを選択することです。このグループ内では、一意のレコードが1つだけです。 –

答えて

0

は、私はあなたがこれをやろうとしている収集:

多くの理髪師、多くのシフトと、それぞれがあります。各シフトには日付と時刻があり、いずれのシフトでも各理髪店が利用可能であるか利用できない可能性があります。

あなたが

これが最大のID(タイムスロット順)しているそのタイムスロットで利用可能な床屋、少なくとも1つの利用可能な床屋を持っている2017年9月6日の各時間帯のために、検索したいですあなたのやり方:

Shift.where(date: '2017-09-06').where(is_free: true).order(:time).group(:time).maximum(:barber_id) 

選択したすべてのシフトが同じ日付になるため、日付でグループ化する必要はありません。

Shift.where(is_free: true).order(:date, :time).group(:date, :time).maximum(:barber_id) 
+0

ありがとう!はい、その結果は同じですが、私のクエリはオブジェクトのコレクションを返しますが、コードは配列[日付、時刻]およびbarber_idに等しい値のキーを持つハッシュを返します。おそらく、私はそれを再フォーマットする別の方法を書いています。とにかくおかげありがとう。 –

関連する問題