Spesso ho avuto la necessità di dover inserire nei miei progetti delle condizioni multiple alle mie select, il problema era che queste condizioni a loro volta dipendevano da altre.

Vi faccio subito un esempio per farvi capire cosa intendo:
Blog.find(:all,
:conditions => ["new=? and type=?",true, params[:type_id]])

Il problema è che se non passo il parametro params[:type_id] ottengo un errore, in questo caso facilmente gestibile, ma se avessi 4 o 5 clausole, il tutto sarebbe più macchinoso.

Quindi ho optato per un approccio diverso. Ho preso parte del codice fornitomi da un amico Divoxx e l'ho modificato in modo molto duttile.

Per prima cosa scaricate il mio plugin ed installatelo nel vostro progetto:

script/plugin install http://lipsiasoft.googlecode.com/svn/trunk/filter

Ora per fare quello che abbiamo accennato all'inizio possiamo semplicemente fare cosi:

filters = Filter.new
filters.equal params[:type_id], :type_id if params[:type_id]
filters.great params[:date_start], :created_at if params[:date_start]
filters.less params[:date_end], :created_at if params[:date_end]
filters.equal params[:cat_id], :cat_id if params[:cat_id]

blogs = Blog.find(:all, :conditions => filters.conditions)

Agile no?

Attendo un bel voto su AgileWebDevelopment