2012-07-12 49 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