0

Rails3.2.8アプリには請求書の表があります。延滞している/延滞していない請求書を選択したいと思います。請求書テーブルにはinvoice_date(日付)とcredit_term(整数)があります。invoice_date + credit_term(day)> Date.todayの場合、請求書は期限切れにならないという考え方です。それ以外の場合、請求書は期限切れになります。これがアイデアです(クエリが機能していません):

Invoice.where("invoice_date + credit_term.days > ?", Date.today)

SQLクエリのinvoice_dateにcredit_term日を追加する正しい方法は何ですか?DBに依存しないソリューションが必要です。本当にありがとう。

4

3 に答える 3

2

MySQL (RDBMSを指定していません)

Invoice.where("DATE_ADD(invoice_date, INTERVAL ? DAY) > ?", credit_term.days, Date.today)
于 2012-08-29T17:54:53.310 に答える
1

日付をルビーでラングリングしてみませんか?

 Invoice.where("invoice_date > ?", Date.today - credit_term)

これは、invoice_dateのインデックスを使用してクエリを実行することもできますが、MySQL(たとえば)を使用した場合、そのようなインデックスを使用することはできません。Date_Add

Date.current(考慮しない)Time.zoneの代わりに(考慮に入れる)の使用を検討することをお勧めしますDate.today

于 2012-08-29T18:21:51.873 に答える
1

私はActiveRecordのクエリインターフェイスの専門家ではありませんが、(1)DBに変更を加えるか、(2)請求書を「手動で」(Rubyコードを介して)フィルタリングしない限り、必要なものを見つけることができませんでした。 )。

オプションは次のとおりです。

  1. フィールドを持つ代わりに、次のcredit_termいずれかを行うことができます。

    • due_date列に置き換えます、または
    • due_date追加し、credit_term同様に保存します。これにより、既存のコードが破損することはなく、1億を超える請求書を受け取らない限り、本番DBサーバーが危険にさらされることはありません。
  2. サーチャー(Sphinxのようにthinking-sphinx gemを介して)を追加し、請求書のインデックスを作成できます。適切に定義されたインデックスを使用すると、Sphinxのクエリインターフェイスを使用して、条件に一致する請求書を見つけることができます(具体的な例を教えてください。この投稿を更新します)。このアプローチには、次の利点があります。

    • DBを1ビット変更しないでください。
    • 24時間に1回だけインデックスを再作成する必要がある検索データを備えた非常に高速な検索エンジンを利用します。
  3. 次のようなRubyコードを使用して、必要な請求書を「手動で」見つけることができます。

    invoices = []
    today = Date.today
    Invoice.find_each do |i|
      invoices << i if (i.invoice_date + i.credit_term) > today
    end
    

    を使用find_eachすると、レコードをバッチでフェッチしていることが保証されます。つまり、テーブル全体をフェッチしているわけではありません。

于 2012-09-01T12:15:16.470 に答える