2010-12-15 75 views
0

我有一个模型项目与索引字段名为_key,这是字符串(搜索关键字)的数组。 现在我需要以另一种形式对此模型(通过JSON)进行自动完成,问题在于,不是通过用户输入的所有单词进行精确搜索,而是需要通过除最后一个单词之外的所有单词进行精确搜索。所以我做了这个作用域在这个模型:MongoID和多键查询问题

scope :find_by_keywords, lambda { |keys| where(:_keys.all => keys) } 
scope :for_autocomplete, lambda { |keys| where(:_keys.all => keys[0..-2], :_keys => /^#{keys[-1]}/i) } 

用于精确搜索的第一个范围效果很好,但我有与自动完成第二范围的问题。 MongoID优化(或类似)此查询,因此它变成

db_development['items'].find({:_keys=>/^qwer/i}, {}) 

即它总是错过了第一个条件。这并不奇怪,因为它在不同条件下需要不同的标准。 所以我尝试了许多选择。 .all和.in的不同组合,分别适用于不同的'wheres','all_in'方法,'find(:conditions => ...)'等。你能提出建议吗,我该怎么做这份工作?

回答

0

我发现这样的解决方案:

scope:for_autocomplete,lambda {| keys |在哪里(:_ keys.all => keys [0 ..- 2] + [/ ^#{keys [-1]} /])}

似乎工作。