:conditions dans find

Bonjour à tous,

je debute avec rails , ma question est surement trivial mais bon je
cherche depuis un certain temps et je ne trouve pas comment
dans :conditions de find faire une verification avec une expression
reguliere … quelque chose comme:

pattern=/ma_regex/
@photos.find(:first,:conditions=>“tag =~’#{pattern}’”).path

meme si le contenu de tag match avec ma_regex
avec ce type de syntax j’obtient :You have a nil object when you
didn’t expect it!

Merci, d’avance

Hello Ecrevisse,

pattern=/ma_regex/
@photos.find(:first,:conditions=>“tag =~‘#{pattern}’”).path

plusieurs possibilités: si @photos contient peu d’éléments, tu peux
utiliser (ici pour récupérer les paths de toutes les photos
concernées):

paths = @photos.find_all { |p| p.tag =~ pattern }.map(&:path)

Si par contre tu veux faire une requête en base sur quelque chose de
plus gros (mais ça va coûter plus cher), à ma connaissance Rails ne
propose rien en standard. Toutefois ActiveRecord::Extensions (http://
rubyforge.org/projects/arext/ - plugin qui étend ActiveRecord) te le
propose, lui, et ça prendra alors la forme suivante (avec pattern
toujours une regexp):

photos = Photo.find(:all, :conditions => { :tag => pattern }

Au final, il peut être préférable, suivant les cas, d’éviter
d’utiliser une regexp (peut être un like, ou mieux, aucune comparaison
de texte mais en procédant autrement, à cogiter) car les regexp
couteront cher si tu as du volume…

Hope this helps!

Thibaut

Le 15/08/07, Thibaut Barrère[email protected] a écrit :

Au final, il peut être préférable, suivant les cas, d’éviter
d’utiliser une regexp (peut être un like, ou mieux, aucune comparaison
de texte mais en procédant autrement, à cogiter) car les regexp
couteront cher si tu as du volume…

Si je ne me trompe pas, l’utilisation de regexp dans une requête SQL
n’est pas “standard” du coup c’est pasz trivial. (Certaine base de
donnée propose peut-être des fonctions pour utiliser des regexp dans
les requêtes ?)

Du coup, comme la déjà dit Thibaut, soit tu ramène tout et tu filtre
via une regexp le resultat (ActiveRecord utilise la lazieEvaluation
histoire de pas ramener tout le contenu de la table ?) où bien
utiliser un like (le % est la wildcard).

Je pense que le like devrais te suffire, mais c’est à toi de voir :slight_smile:


Yannick “Pouype” Francois
http://www.typouype.org
http://www.rubyfrance.org

Merci thibaut

@photos contient peu d’éléments donc

paths = @photos.find_all { |p| p.tag =~ pattern }.map(&:path)

marche tres bien dans mon cas
mais je suis vraiment d’accord avec ta remarque une regexp sur chaque
enregistrement retourné c’est pas tres optimisé je vais faire mieux
merci