0

支払いが必要になるまで、日付を超えたすべての請求書を返すoverdueモデルにスコープを実装したいと考えています。Invoiceフィールドinvoice_date, :type => Datedays_for_payment, :type => Integer.

ActiveRecord 上に構築された以前のバージョンでは、クエリを使用できました。

Invoice.where("invoice_date + days_for_payment < ?", Date.today)

このクエリは、DB 側で計算を行いました。

Mongoid で同じことを行う方法はありますか? または、適切な回避策 (proc、ラムダなど) を知っている人はいますか?

私はモンゴイド「2.4.12」を使用しています

4

2 に答える 2

1

答えは自分で見つけました。プレフィックスthis.*を使用して、フィールドを参照できます。そして、JavaScript 関数を使用できます。MongoDB がますますクールに!

だからここに私の解決策があります:

class Invoice
  include Mongoid::Document
  field :invoice_date, :type => Date
  field :days_for_payment, :type => Integer
  ...

  scope :overdue, where("(Math.round(this.invoice_date.getTime() / 1000) + (this.days_for_payment * 24 * 3600)) < #{Time.now.to_i}")

  ...
end

js でのタイムスタンプの作成は、動作が異なります。そのため、最後の 3 つの数字を削除して四捨五入する必要がありました。もっとエレガントな方法を知っている人がいたら教えてください。

残っている唯一の問題は、Dateオブジェクトを MongoDB に保存できないことです。を使用する必要があると常に言われますTime。Mongoid を 3.0.1 にアップグレードしたほうがいいと思います。

于 2012-07-12T18:31:51.983 に答える
0

mongoidについてはわかりません。mongodb に直接クエリを実行している場合は、$where operatorを使用できます。インデックスを使用しないため、お勧めしません。レコードを小さなセットにフィルター処理する別の条件がある場合は、$where を使用してさらにフィルター処理できます。

于 2012-07-12T17:41:05.397 に答える