我想在模型overdue
中实施范围Invoice
,以返回超过日期的所有发票,直到必须付款为止。我有字段invoice_date, :type => Date
和days_for_payment, :type => Integer
。
在我之前的版本(基于ActiveRecord构建)中,我可以使用查询
Invoice.where("invoice_date + days_for_payment < ?", Date.today)
此查询在数据库端进行了计算。
有没有办法让Mongoid完成同样的事情?或者有没有人知道一个好的解决方法(proc,lambda等)?
我使用mongoid'2.4.12'
答案 0 :(得分: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中的时间戳创建工作方式不同。所以我不得不摆脱最后三个数字并围绕它们。 如果有人知道更优雅的方式,请告诉我。
我唯一的问题是,我无法将一个Date
对象存储到MongoDB。它总是告诉我必须使用Time
。我想我最好将mongoid升级到3.0.1。
答案 1 :(得分:0)
我不确定mongoid,如果您直接查询mongodb,可以使用$where operator。不推荐使用它,因为它不使用索引。如果您有另一个条件将记录过滤到一个小集合,那么您可以使用$ where进一步过滤它。