Mongoid命名范围比较同一文档中的两个时间字段

时间:2010-09-25 18:42:23

标签: ruby-on-rails mongodb mongoid

我需要在Mongoid中创建一个命名范围,用于比较同一文档中的两个时间字段。如

scope :foo, :where => {:updated_at.gt => :checked_at}

这显然不起作用,因为它将:checked_at视为符号,而不是实际字段。关于如何做到这一点的任何建议?

更新1

这是我的模型,我声明了这个范围,并删除了许多额外的代码。

class User
  include Mongoid::Document
  include Mongoid::Paranoia
  include Mongoid::Timestamps

  field :checked_at, :type => Time

  scope :unresolved, :where => { :updated_at.gt => self.checked_at }
end

这给了我以下错误:

'<class:User>': undefined method 'checked_at' for User:Class (NoMethodError)

3 个答案:

答案 0 :(得分:7)

据我所知,mongodb不支持对动态值的查询。 但你可以使用javascript函数:

scope :unresolved, :where => 'this.updated_at >= this.checked_at'

为了加快速度,你可以添加一个像“is_unresolved”这样的属性,当这个条件匹配时(和索引那个),它会在更新时设置为true。

答案 1 :(得分:3)

scope :foo, :where => {:updated_at.gt => self.checked_at}

例如,这将起作用:

scope :foo, where(:start_date.lte=>Date.today.midnight)

答案 2 :(得分:1)

不确定你是否喜欢这种方法,它不是最好的,但它应该有效。

class User
  include Mongoid::Document
  include Mongoid::Paranoia
  include Mongoid::Timestamps

  field :checked_at, :type => Time

  scope :unresolved, lambda{ |user| where(:updated_at.gt => user.checked_at) }
end

您使用User.unresolved(my_user_object)调用它 现在看来重读你的帖子后,这可能不会做你想要的。如果这是真的,那么你可能需要使用MapReduce或者可能需要使用Baju的方法(尚未测试过)