Magazine Tecnologia

Query complesse in ruby on rails con Conditions_fu

Creato il 12 dicembre 2011 da Mareika @mareikagiacobbi

 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 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à 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.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 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!

 


Potrebbero interessarti anche :

Ritornare alla prima pagina di Logo Paperblog

Possono interessarti anche questi articoli :