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!

Lascia il tuo commento