Complex SQL Query with Pagination

I am trying to write a relatively complex searching mechanism that
searches for items in a product database that has a where clause that
needs many joins (including joins that pass through two tables, and
joins to different tables from the primary items table) to function
properly. Because the construction of this query depends on options a
user selects, its syntax will need to be dynamically generated per the
user's input, for example (sql is approximate):

A user is searching for items less than $15:
SELECT * FROM items WHERE price < 15;

A user is searching for items less than $15 from a user named "Bob":
SELECT * FROM items WHERE items.price < 15 and user.name = "Bob" INNER
JOIN users ON items.owner_id = users.id;

A user is searching for items less than $15 from a user named "Bob"
that have pictures of turkeys:
SELECT * FROM items WHERE items.price < 15 and users.name = "Bob" and
pictures.content = "turkey" INNER JOIN users ON items.owner_id =
users.id INNER JOIN pictures ON pictures.item_id = item.id;

A user is searching for items less than $15 from a user named "Bob"
that have pictures of turkeys from the country of Turkey:
SELECT * FROM items WHERE items.price < 15 and users.name = "Bob" and
pictures.content = "turkey" and locations.name = "Turkey" INNER JOIN
users ON items.owner_id = users.id INNER JOIN (pictures ON
pictures.item_id = item.id INNER JOIN (locations ON
picture.location_id = location.id))

And I need to paginate my results (preferably using will_paginate,
since we already have it installed and used in other cases).

Obviously, this isn't a case where I want to write the world's largest
switch statement. Does anyone know of any plugins or methodologies to
use in a case like this where I might have an arbitrarily large number
of joins and where conditions that need to be built into a SQL where
and join clause, and ultimately paginated?

Thanks,
Bill Harding

If any future generations are curious about this, I've written my own
class that handles creating an arbitrary number of joins and includes
that handle all of the situations I describe below. It has some
overlap with ez-where, but I've found it a bit simpler for interfacing
with pagination parameters.