我想实现一个范围overdue
模型中的Invoice
返回超出之日起,直到他们不得不支付所有发票。 我有字段invoice_date, :type => Date
和days_for_payment, :type => Integer
。
在我以前的版本,它是建立在ActiveRecord的,我可以使用查询
Invoice.where("invoice_date + days_for_payment < ?", Date.today)
这个查询就这一DB侧的计算。
有没有办法让与Mongoid做同样的事情? 还是没有人知道一个很好的解决方法(PROC,λ,等等)?
我用mongoid“2.4.12”
找到自己的答案。 随着前缀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。
我不知道mongoid ,如果你要查询的MongoDB直接就可以使用,其中运营商$ 。 这是不建议,因为它不使用索引。 如果您有过滤记录一小部分,那么你可以使用$另一种情况,其中,以进一步过滤。