2011-09-17 7 views
10

C'è un modo per impostare un attributo in mongoid per le ricerche senza distinzione tra maiuscole e minuscole?Ricerca insensibile alle maiuscole/minuscole nelle parole mongoid

Diciamo che qualcuno ha un nome utente: IAmGreat e voglio trovare i dati degli utenti usando il loro nome utente univoco senza doverlo macellare e cambiarlo in iamgreat.

Grazie

risposta

1

Perché non solo lungo una (o qualunque sia la combinazione del modello/attributo viene) User.login.downcase quando si effettua il confronto? Ciò lascerà la capitalizzazione nel DB così com'è, ma ridurrà il campo solo per il confronto.

46

In realtà è possibile cercare senza distinzione tra maiuscole e minuscole. Ma devi cercare con una regex! Ecco un esempio di come lo sto usando in http://www.VersionEye.com

User.first(conditions: {email: /^#{email}$/i}) 

Con il "/" si stanno iniziando e terminando la regex. La "i" dopo la regex significa maiuscole e minuscole. "^" Significa che l'elemento deve iniziare con la stringa di ricerca e "$" significa che l'elemento deve terminare con la stringa di ricerca. Questo è importante se stai cercando una corrispondenza esatta.

+10

FYI: potrebbe essere necessario disinfettare il tuo regex se include l'input dell'utente: '/^# {Regexp.escape (email)} $/i' – Andrew

+1

user = dove (email: /^#{email}$/i).first – shilovk

5

Si può anche provare qualcosa di simile:

User.where(username: /#{username}/i).first 
+0

(1) Che non controlla caso- uguaglianza insensibile (2) Che (AFAIK) non userà un indice per controllare la raccolta in modo che possa essere molto costoso. –

+0

Sì. Questo è il 50% più lento della query predefinita. Ma controlla l'uguaglianza insensibile alle maiuscole e minuscole. – mrudult

+1

No, non controlla l'uguaglianza. Il tuo regex non ha ancora. –

2

se si utilizza rotaie o mongoid si può provare la ff:

@user = User.where({:username => /.*#{name}.*/i })