我需要在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)
答案 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的方法(尚未测试过)