I am building a query that could end up look like this:
SELECT "patients".* FROM "patients"
INNER JOIN "users" ON "users"."id" = "patients"."user_id"
WHERE (users.username LIKE '%Bob%' AND users.last_name LIKE '%Smith%'
AND users.active = '1' AND users.disabled = '1')
ORDER BY users.first_name DESC LIMIT 10 OFFSET 0
Below is code to create a complex query such as:
conditions = []
where = ''
where_parameters = []
order = 'users.last_name ASC'
per_page = 20
if is_admin?
if defined?(params[:username]) and !params[:username].blank?
where += 'users.username LIKE ? AND '
where_parameters.push("%#{params[:username]}%")
end
if defined?(params[:last_name]) and !params[:last_name].blank?
where += 'users.last_name LIKE ? AND '
where_parameters.push("%#{params[:last_name]}%")
end
if defined?(params[:active]) and !params[:active].blank?
where += 'users.active = ? AND '
where_parameters.push(params[:active])
end
if defined?(params[:disabled]) and !params[:disabled].blank?
where += 'users.disabled = ? AND '
where_parameters.push(params[:disabled])
end
if !where.empty?
where = where[0, where.length - 5]
conditions = [where, *where_parameters]
end
if defined?(params[:order_by]) and !params[:order_by].blank?
order = params[:order_by] + ' '
end
if defined?(params[:order]) and !params[:order].blank?
order += params[:order]
end
if defined?(params[:per_page]) and !params[:per_page].blank?
per_page = params[:per_page].to_i
end
@patients = Patient.joins(:user).paginate(:all, :include =>:user, :conditions => conditions, :order => order, :page => params[:page], :per_page => per_page)
Is there a better way to do this, this is just ugly?