Come si sa è possibile interrogare un modello in modo da leggere tutti i record che rispettamo una specifica condizione, questo in ruby on rails è possibile attraverso la clausola :conditions. Supponiamo di avere un modello chiamato Dog che contiene un anagrafica di cani i quali hanno attributi come: nome, razza, peso, età, ecc...
Per recuperare tutti i cani con razza "chihuahua" possiamo interrogare il modello in questo modoDog.all(:conditions => {:race => "chihuahua"})per recuperare tutti i cani con il nome che inizia per "c" possiamo usare
Dog.all(:conditions => ["name like ?", "%c"])Questo non mi entusiasma molto perchè ho l'esigenza di creare un hash con all'interno tutte le condizioni che filtreranno il modello, ad esempio
conditions = Hash.new conditions[:name]="Ulisse" conditions[:race]="Ulisse" Dog.all(:conditions => conditionsFortunatamente ho trovato conditions_fu http://github.com/nesquena/conditions_fu che estende le funzionalità di ActiveRecord::Base#find in modo da creare hash con all'interno delle condizioni. Per installarlo
ruby script/plugin install git://github.com/nesquena/conditions_fu.gitCi verranno in soccorso i seguenti operatori
Equal -> :eql Less Than -> :lt Less Than Or Equal -> :lte Greater Than -> :gt Greater Than Or Equal -> :gte Like -> :like In -> :in Not In -> :notOra posso fare query complesse con il minimo sforzo. Ritorniamo al caso in cui sia necessario usare l'operatore like per interrogare il modello Dog, violà...
Dog.all(:conditions => {:name.like => "%c" })Oppure crando un hash del tipo
conditions = Hash.new conditions[:name.like]="%c" conditions[:weight.gte]=3 conditions[:weight.lte]=10 Dog.all(:conditions => conditions)Così avremo tutti i cani con il nome che inizia per "c" e che hanno peso compreso tra 3 e 10. Segnalo anche la possibilità di usare l'operatore or in questo modo
Dog.any(:conditions => conditions)...niente male!