Creating an escaped JOIN?

Hi,

When creating a custom find for a model, with AR it is possible to do something like:

:conditions => ['user_id = ?', params[:id]]

However, I would like to know if it is possible to do the same when specifying a JOIN:

:joins => ['LEFT OUTER JOIN orders ON (items.order_id = orders.id AND orders.user_id = ?', params[:id]]

I tried the above expression, but unfortunately, Rails didn't replace the question mark with its escaped value.

Any idea if this is possible? I need to move some filtering from the WHERE clause into the ON clause and have it all escaped.

Placeholders are not supported there indeed.

You cannot work with regular AR association API calls right? For example:

   # untested    user = User.find(params[:id])    items = user.orders.map(&:items).flatten.uniq

or say:

   # untested    items = Item.all(      :conditions => {'users.id' => params[:id]},      :joins => {:order => :user}    )

If not, you can still extract an integer from params[:id] and safely interpolate. That's easy with Integer() or #to_i.

-- fxn

> :joins => ['LEFT OUTER JOIN orders ON (items.order_id = orders.id AND > orders.user_id = ?', params[:id]]

Placeholders are not supported there indeed.

You cannot work with regular AR association API calls right? For example:

# untested user = User.find(params[:id]) items = user.orders.map(&:items).flatten.uniq

or say:

# untested items = Item.all( :conditions => {'users.id' => params[:id]}, :joins => {:order => :user} )

If not, you can still extract an integer from params[:id] and safely interpolate. That's easy with Integer() or #to_i.

and more generally the connection object's quote method (and variants) are useful. See also the sanitize_sql method.

Fred

Hi Fred,

sanitize_sql is the way to go, then I simply evaluate what it spits me out inside my :joins value.

Regards,