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

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

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

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

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

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

=> “orders.id = 1 AND orders.id = 2”

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

Thanks!

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

Sounds like you are looking for

some_scope.unscope(:where)

Fred

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.

-Jason

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
https://groups.google.com/d/msgid/rubyonrails-talk/bbc2f6bd-8713-472d-b184-e737a83d0929%40googlegroups.com
https://groups.google.com/d/msgid/rubyonrails-talk/bbc2f6bd-8713-472d-b184-e737a83d0929%40googlegroups.com?utm_medium=email&utm_source=footer.
For more options, visit https://groups.google.com/d/optout
https://groups.google.com/d/optout.


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
this.

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

Order.try{|query|
if x==1
query
else
query.unscope(:where)
}

Sounds like you are looking for

some_scope.unscope(:where)

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