2010-12-15 12 views
0

私は、_keyという名前の索引付きフィールドを持つモデルItemを持っています。これは、文字列の配列(検索のキーワード)です。 このモデル(JSON経由)のオートコンプリートは別の形式で行う必要があります。問題は、ユーザーが入力したすべての単語で正確に検索するのではなく、最後の単語を1つだけ残して完全に検索することです。だから私は、これは、このモデルではスコープ製: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}, {}) 

となります。つまり、最初の条件がすべて失われます。異なる条件のためにフィールドで異なる基準を必要とするため、驚くことではありません。 私は多くのオプションを試しました。異なる 'wheres'、 'all_in'メソッド、 'find(:conditions => ...)'などのように、.allと.inの異なる組み合わせ。私はこの仕事をどうやってやれるの?

答えて

0

私はこのようなソリューション見つけた:

範囲:for_autocomplete、ラムダ{|キー| (:_ keys.all => keys [0 ..- 2] + [/ ^#{keys [-1]} /])}

と思われます。