2010-12-15 82 views
0

J'ai un élément de modèle avec un champ indexé nommé _key, c'est-à-dire un tableau de chaînes (mots-clés pour la recherche). Maintenant, j'ai besoin d'auto complétion pour ce modèle (via JSON) sous une autre forme, et le problème est qu'au lieu de la recherche exacte par tous les mots saisis par l'utilisateur, je dois faire une recherche exacte. Donc, je fait ce scopes dans ce modèle:Problème de requête MongoID et multi-clés

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) } 

la première portée pour la recherche exacte fonctionne bien, mais j'avoir des problèmes avec la deuxième portée de saisie semi-automatique. MongoId optimise (ou quelque chose comme) cette requête, il devient

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

à-dire qu'il manque AllWays la première condition. Ce n'est pas surprenant, car il faut des critères différents sur le terrain pour différentes conditions. J'ai donc essayé beaucoup d'options. Différentes combinaisons de .all et de .in, séparées de différentes «wheres», «all_in», «find (: conditions => ...)» et ainsi de suite. Pourriez-vous me suggérer comment je peux faire ce travail?

Répondre

0

J'ai trouvé cette solution:

portée: for_autocomplete, lambda {| clés | où (: _ keys.all => clés [0 ..- 2] + [/^# {touches [-1]} /])}

Semble fonctionner.