0

我想overdue在模型中实现一个范围Invoice以返回所有超过日期的发票,直到必须付款。我有字段invoice_date, :type => Datedays_for_payment, :type => Integer.

在我之前基于 ActiveRecord 构建的版本中,我可以使用查询

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

该查询在数据库端进行了计算。

有没有办法用 Mongoid 完成同样的事情?或者有人知道一个好的解决方法(proc、lambda 等)吗?

我使用 mongoid '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 中创建时间戳的工作方式不同。所以我不得不去掉最后三个数字并将它们四舍五入。如果有人知道更优雅的方式,请告诉我。

我剩下的唯一问题是,我无法将Date对象存储到 MongoDB。它总是告诉我必须使用Time. 我认为我最好将 mongoid 升级到 3.0.1。

于 2012-07-12T18:31:51.983 回答
0

我不确定mongoid,如果您直接查询 mongodb ,您可以使用$where 运算符。不推荐,因为它不使用索引。如果您有另一个条件将记录过滤到一个小集合,那么您可以使用 $where 进一步过滤它。

于 2012-07-12T17:41:05.397 回答