Rails : conditions complexes avec des hashes

In: Rails

16 juin 2009

Vous le savez probablement déjà, il est possible, avec Active Record, de faire vos conditions proprement de deux manières différentes :
Model.find(:all, :conditions => ['champ = ?', valeur])
Model.find(:all, :conditions => {:champ => valeur})

Le second est plus propre. Cependant à première vue, il n’est pas possible d’y faire des conditions autres que le égal (=).
Du coup dès que votre condition devient un chouilla complexe, il deviendrait nécessaire d’utiliser les crochets. C’est dommage.

Heureusement, il des conditions autres que le = sont gerées avec les hashes.
Petit exemple de requête
Model.find(:all, :conditions=>{
:title => "Title",          # title='Title'
:published_at => (Date.now-30 .. Date.now),  # published_at BETWEEN xxx AND xxx
:rating => [ 4, 5, 6 ],          # rating IN ( 4, 5, 6 )
:content => /(a|b|c)/          # REGEXP '(a|b|c)'
)

Cela permet déjà de faire quelques requêtes supplémentaires. Cependant dès que l’on va vouloir faire des choses comme des LIKE, des !=, des >= ou des <=, nous allons, de toute façon, devoir passer par des tableaux.

Cet article est rédigé par Damien MATHIEU.
Et est disponible sous licence creative common by-nc-nd.
Si vous appréciez son contenu, n'hésitez pas à me recommander.

2 Responses to Rails : conditions complexes avec des hashes

Avatar

Traz

juin 16th, 2009 at 23:50

Hello !
Je viens de découvrir ton blog au détour d’une recherche sur les nested comments :)

Ton truc à l’air bien sympa mais ne marche pas pour moi (rails 2.3.2). Il bati une recherche SQL avec le nom complet fournit (rating_gt, author_contains, …).

Je ne vois que 2 solutions pour parvenir au même résultat :
- construire tous les names scopes utilisés dans le model,
- ou utiliser une librairie du genre trixy_scopes sur git qui fait le boulot.

Traz

Ads

Avatar

Damien

juin 17th, 2009 at 9:34

Merci Traz pour le commentaire. Je n’avais pas suffisamment testé la chose. Du coup je n’ai pas vu que ce n’est plus valable dans les versions actuelle de Rails.

C’est corrigé.

Comment Form

Photostream

    In the TramwayChristmas TreeOld TrainPlaying chessLyon by nightLightSunshine on Tel AvivMamanLeft Dead on the Road

Fork me on GitHub