2012-07-12 70 views
0

我想在Invoice模型中實現範圍overdue,以返回超過日期的所有發票,直到他們必須支付。我有字段invoice_date, :type => Datedays_for_payment, :type => Integer根據Mongoid計算字段進行查詢

在我以前的版本,它是建立在ActiveRecord的,我可以使用查詢

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

這個查詢就這一DB側的計算。

有沒有辦法讓Mongoid完成同樣的事情?或者是否有人知道一個好的解決方法(proc,lambda等)?

我用mongoid「2.4.12」

回答

1

我自己找到答案。前綴this.*我可以參考這些字段。我可以使用JavaScript功能。 MongoDB變得更酷更酷!

因此,這裏是我的解決辦法:在JS

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 

時間戳創作的作品不同。所以我必須擺脫最後三個數字並圍繞它們。 如果有人知道更優雅的方式,請讓我知道。

我唯一剩下的問題是,我無法存儲一個Date對象到MongoDB。它總是告訴我,我必須使用Time。我想我最好將mongoid升級到3.0.1。

+1

有沒有更好的方式來操縱JS中的日期。從時代開始,所有事情都以毫秒爲單位。但是,在你的特定情況下,當你存儲':invoice_date'和':days_for_payment'時,你可以使用'before_validation'或'before_save'回調函數來存儲':overdue_date':這樣會更有效,因爲你可以正常查詢,用索引來表示(也是範圍查詢)。 – 2012-07-14 08:02:52

0

我不知道mongoid,如果你要查詢的MongoDB直接就可以使用$where operator。不推薦使用它,因爲它不使用索引。如果您有其他條件將記錄過濾到一個小集合,那麼您可以使用$ where進一步過濾它。

+0

謝謝,但我想我已經找到了我自己的解決方案! [這裏...](http://stackoverflow.com/questions/11457031/query-based-on-calculated-fields-with-mongoid/11458328#11458328) – Hiasinho 2012-07-12 18:35:00