Let's work on getting perfect codes
In: Rails
16 juin 2009Vous 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.
2 Responses to Rails : conditions complexes avec des hashes
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
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é.