Re: Multiple :conditions complexity

Steve Downey
Wed, 31 Aug 2005 19:32:11 -0000

I handle this by building up an array of "where" and an array of
"bind":

if params[:x]  # one for each param
  @where << "x = ?"
  @bind << params[:x]
end

@where_string = @where.join(" and ")

then in the find()

:conditions => [@where_string, @bind].flatten

this is an untested excerpt from code that *does* work

Kevin E. Hunt wrote:

> I''ve run into an issue with the complexity of generating the
> :conditions array using multiple, *optional* search parameters.  I
> have two search terms: user_id and category.  Because they are
> optional, if not specified the controller should not filter on that
> column name.
>
> I essentially have to build the condition array for each possible
> search combination.  It works but it is unnecessarily complex,
> especially when I want to add a 3rd search parameter.
>
> dif list   # filter_by_* is set by before_filter
>    conditions = []
>    if @filter_by_user && @filter_by_categories
>      conditions << "user_id=? and category in (?)"
>      conditions << @filter_by_user
>      conditions << @filter_by_categories
>    elsif @filter_by_user
>      conditions << "user_id=?"
>      conditions << @filter_by_account.id         elsif
> @filter_by_categories
>      conditions << "zipcode in (?)"
>      conditions << @filter_by_categories
>    else
>      conditions << ''1'' # TODO: This is also stupid
>    end
>
>    @xyz_pages, @xyzs = paginate :xyz,
>      :per_page => 10,
>      :conditions => conditions,
>      :order_by => "created_at desc"
> end
>
> I attempted to go the path of xyz.find_by_* but it looks like paginate
> wants to take care of the query on its own.
>
> I''m hoping someone has found a nice way to do this, or that
> :conditions is smarter than I think it is.  Any ideas?
>
> Kevin E. Hunt
>
> _______________________________________________
> Rails mailing list
> Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org
> http://lists.rubyonrails.org/mailman/listinfo/rails
>