2017-03-23 12 views
1

私は多くの請求書を持っている仕事をしており、請求書は仕事に属しています。最初の請求書が日付範囲内にあるジョブを照会する必要があります。句は擬似コードですが、それはあなたに私がしているよかのアイデアを与えるRailsクエリ:associationは親の最初に関連付けられたレコードですか?

@jobs = Job.joins(:invoices). 
    where("invoices.date BETWEEN ? AND ?", @from_date, @to_date). 
    where("invoices = job.invoices.first") 

第二:私はこのクエリを持っています。

重要な場合はMYSQLを使用しています。

+0

スコープを大いに活用! –

答えて

1

私のクエリは次のようになります。

@jobs = Job.where(" 
    id IN (
    SELECT T1.job_id 
    FROM invoices as T1 JOIN (
     SELECT job_id, MIN(id) AS first_id 
     FROM invoices 
     GROUP BY job_id 
    ) as T0 ON T1.id = T0.first_id 
    WHERE T1.date > ? AND T1.date < ? 
) 
", @from_date, @to_date) 

説明:

  • T0がJOB_ID
  • T1でグループ化された最初の請求書IDをJOB_ID含まれているがINVOICEテーブルはこれだけ、first_id上のT0で参加しますです最初の請求書が選択され、指定した日付範囲でフィルタリングされます
  • サブクエリのジョブのIDを問い合わせます
+0

ありがとう!意味あり!とても有難い! – gregblass

+0

これは私にSQL構文エラーを与えています... – gregblass

+0

エラーメッセージは何ですか? –

1

Railsは次のようにスコープを追加することで使用してこれを行う最も簡単な方法:

has_one :first_invoice, -> { order('created_at DESC') }, class_name: 'Invoice' 

次に、あなただけ行うことができます。

@jobs = Job.joins(:first_invoice).where("invoices.date BETWEEN ? AND ?", @from_date, @to_date) 

EDIT - これは実際には動作しませんが。最初の請求書スコープは、ジョブのインスタンス上で最初の請求書を取得するために機能しますが、参加するときには機能しません。

1

もう1つの方法 - ジョブに列を追加し、first_invoice_date(および索引付けする)を格納できます。スコープの照会、ソート、結合、最初の請求書日付の照会などは非常に簡単です。

+0

固溶体。私はこれをやり遂げるかもしれない。ありがとう! – gregblass

関連する問題