2013-02-22 77 views
0

查询语法问题,我有一个Ruby协会类,如下所示:Mongoid 3.1的Ruby 1.9.3

class Association 
    include Mongoid::Document 
    field :issued, type: Integer 
    field :lifetime, type: Integer 
end 

而且我要删除所有文档的我的集合,其中doc.issued + doc.lifetime > Time.now英寸我在网上找到了下面的语法:

Association.delete_all(["issued + lifetime > ?", Time.now.to_i])

我不能得到这个工作,我得到以下错误:

TypeError: can't convert Symbol into Integer 
    from /var/lib/gems/1.9.1/gems/mongoid-3.1.0/lib/mongoid/persistence.rb:298:in `[]' 
    from /var/lib/gems/1.9.1/gems/mongoid-3.1.0/lib/mongoid/persistence.rb:298:in `delete_all' 
    from (irb):77 
    from /usr/bin/irb:12:in `<main>' 

有人能告诉我有什么不对的语法或建议不同的语法,将工作?

回答

1

DELETE_ALL,像其中,单场需要list of conditions,如:

Association.delete_all(issued: 10)

在你的情况,你可以使用JavaScript。

Association.for_js("(this.issued + this.lifetime) > ti", ti: Time.now.to_i).delete_all

注:业绩不会好,因为条件将在每个文件进行测试。

+0

这应该工作。在我真正的实现中,发布的是DateTime。我可以在这个答案中调用this.issued.to_i,还是需要将它移动到像ti这样的外部变量? – 2013-02-22 19:07:22

+0

“(this.issued + this.lifetime)> ti”是Javascript指令,而不是Ruby指令。所以你只能使用Javascript函数,因此this.issued.to_i将不起作用。因为你想保留这个变量,所以你不能在外面移动。 – Aymeric 2013-02-22 23:25:26