Re: Multiple :conditions complexity

Albert Yi
Thu, 01 Sep 2005 22:24:00 -0000

I do the same thing. You can generate some complicated queries this way:

cond = []
params = []

if param[x]
    cond << "sql"
    params << some_value

    inner_cond = []
    inner_cond << "("
    if bar
        inner_cond << "sql"
    else
        inner_cond << "false"
    end
    inner_cond << ")"
    cond << inner_cond.join(" OR ")
end

find :all, :conditions => [cond.join(" AND "), *params]

Just be sure to keep cond and params in sync otherwise you''ll get weird
SQL errors.

Steve Downey wrote:

> 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
>>
>
> _______________________________________________
> Rails mailing list
> Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org
> http://lists.rubyonrails.org/mailman/listinfo/rails
>
>