My application has several search fields. Each field is optional and
if they are all left blank, I return some reasonable results. If the
fields were simply conditional I could add each search term to a hash
then pass that hash as conditions, like so:
conditions = {}
conditions[:a] = 1 if params[:a] == 1
conditions[:b] = 1 if params[:b] == 1
Task.find(:all, :conditions => conditions.empty? ? nil : conditions)
The problem is that some of the search terms aren’t that simple. One
is a date field another is a name so I want to perform a find such as:
Task.find(:all, :conditions => [‘start >= ?’, params[:date]])
Task.find(:all, :conditions => [‘name LIKE ?’, “%#{params[:name]}%”])
…but I also want to include the conditions hash if there are simple
comparison fields. I’d also like to potentially combine the two
conditions above. How to creating a conditions array with multiple
optional conditions isn’t obvious (to me at least). What I’m doing as
a workaround is nesting the conditions has inside a with_scope for
each kind of “special” (not simple hash’able conditions) but it’s not
DRY and it’s not clean.
Is there a way to use both a conditions hash and array with a find?
Or is there a way to create a “>=” or “LIKE” condition using a hash?
- Peter