2010-09-12 21 views
6

Sto cercando di convalidare wether un Model.category uguale qualsiasi nome categoria esistentePuoi inserire una variabile in un'espressione regolare?

unless Category.exists?(:name => self.category.downcase) 

ho dovuto mettere downcase in questo al fine di garantire tutti sono stati downcased in modo da poter abbinare come stringhe. Ma è un grande server colpito per aggiornare l'attributo before_save, e stavo pensando di abbinarli tramite regexp. Qualcosa di simile

unless Category.exists?(:name => /#{self.category}/ } 

C'è qualcosa del genere possibile? O c'è un modo migliore per farlo?

+0

Perché è un hit server aggiuntivo per eseguire il downcase dell'attributo prima del salvataggio? –

risposta

2

Non riesco a capire qual è il tuo vero problema qui con downcasing ma suppongo che si doveva downcase categorie esistenti prima prima del confronto. Suppongo che regexp non aiuti qui perché come "=>" nelle condizioni è il confronto case sensitive (default nei DB) e regexp non è supportato da AR. Si dovrebbe fare in un altro modo:

PostgreSQL:

books = Book.find :all, :conditions => [ "authors ILIKE ?", "smith" ] 

Mysql:

author = "Smith".downcase 
books = Book.find :all, :conditions => [ "LOWER(authors) LIKE ?", "#{author}" ] 

o

books = Book.find :all, :conditions => [ "authors LIKE ? COLLATE utf8_general_ci", "smith"] 

The esiste? il metodo dovrebbe funzionare con: parametri delle condizioni come sopra. Se ciò causa per te un qualsiasi hit DB, ad es. hai milioni di categorie. Quindi devi creare una colonna separata con il nome downcased e confrontarla con la semplice condizione "=>".

+0

Grazie Gertas!Ottimo primo post, benvenuti a Stack – Trip

+0

Grazie, assicurati anche che gli spazi iniziali e finali siano rimossi (Stringa # strip o Stringa # strip!), Gli utenti digitano molte cose strane. – gertas

0

Non so come programmare in Ruby, ma certamente si può ottenere concatenando una stringa con regexp con la stringa e quindi eseguendo regexp.

+0

come si aggiunge l'opzione di insensibilità alle maiuscole/i ad un'espressione regolare? – Trip

2
x = 'fluffy' 
Regexp.new x.to_s 

Forse c'è un modo migliore.

+0

?? Non capisco, mi dispiace. :( – Trip

+3

'/ expression /' è uno zucchero sintattico per la classe 'Regexp', con quest'ultimo è possibile creare esplicitamente una nuova espressione regolare, quindi' Regexp.new (self.category, Regexp :: IGNORECASE) 'è ciò che necessario (ma è possibile utilizzare anche l'interpolazione delle stringhe). Maggiori informazioni disponibili nella documentazione: http://ruby-doc.org/core/classes/Regexp.html –

+0

Grazie a Foatless. Ottimo consiglio: D Il problema è che – Trip

23

Sì, è possibile utilizzare l'interpolazione variabile in un'espressione regolare.

>> s = "thing" 
=> "thing" 
>> r = /#{s}/ 
=> /thing/ 
+0

Impressionante, hey non sapresti come aggiungere l'opzione insensibilità al caso/i alla tua espressione regolare, vero? – Trip

+2

Basta aggiungere un 'i': r =/# {s}/i – steenslag

+0

Hmm .. sembra che tutta questa interpolazione sia solo restituendo un'espressione regolare, e non il risultato finale di ciò che voglio: – Trip

Problemi correlati