Come si sa è possibile interrogare un modello in modo da leggere tutti i record che rispettamo una specifica condizione, questo inruby on rails è possibile attraverso la clausola :conditions. Supponiamo di avere un modello chiamato Dog che contiene un anagraficadi 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 modo
Dog.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 => conditions
Fortunatamente ho trovato conditions_fu http://github.com/nesquena/conditions_fu che estende le funzionalità diActiveRecord::Base#find in modo da creare hash con all’interno delle condizioni. Per installarlo
ruby script/plugin install git://github.com/nesquena/conditions_fu.git
Ci 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 -> :not
Ora posso fare query complesse con il minimo sforzo. Ritorniamo al caso in cui sia necessario usare l’operatore like per interrogareil 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!