How to remove (and resuse) all existing constraints from ActiveRecord::Relation

I’d like to remove all existing constraints from an
and leave the rest in-tact.

I am not looking for #unscoped since I would like to keep any
clauses around.

Additionally, I would like to re-use the constraints that were removed
another query, so the ability to call #to_sql on them would be a very

This is the best I’ve been able to hack together:

Order.where(id: 1).where(id: 2).arel.constraints[0].to_sql

=> “ = 1 AND = 2”

…but that just seems wrong. As far as I can tell #constraints always
one item in it, but I don’t know that will always be true.


On Monday, December 29, 2014 1:16:40 AM UTC, Josh wrote:

Sounds like you are looking for



This is the best I’ve been able to hack together:

You can use a .try{ |query| … } block inside the Arel chain.

I think to achieve what you want you would do something like

Order.where(id: 1).try{|query| if continue_with_query; query; else;
Order; end}

Notice that inside the try block I’m passing back either the query (with
Arel constraints) or a new Order class object (which will “reset” all
the constraints because it’ll be a new object)

I actually think a better design would be to adopt this try-block method
for all your constraints, and then add them optionally depending on your
if statement. then you don’t have to do any “resetting” at all because
each individual step will either return the original query or will
return the query with more scope restrictions on it.


This is the best I’ve been able to hack together:

You received this message because you are subscribed to the Google G. “Ruby
on Rails: Talk” group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected]
mailto:[email protected].
To post to this group, send email to [email protected]
mailto:[email protected].
To view this discussion on the web visit
For more options, visit

Jason Fleetwood-Boldt
[email protected]

All material © Jason Fleetwood-Boldt 2014. Public conversations may be
turned into blog posts (original poster information will be made
anonymous). Email re[email protected] with questions/concerns about

You can do that inside a .try{} block too, same idea:

if x==1

Sounds like you are looking for


This doesn’t appear to return the existing constraints for me to re-use