Remove order from ActiveRecord scope
Asked Answered
A

2

83

I'm using rails ransack ( https://github.com/ernie/ransack ) to allow the users to filter and sort some records. I get the filtered and sorted records using traditional methods.

 @invoices = Invoice.search(params[:q]).result

Now I would like to get some summary information so I have

 @invoices = Invoice.search(params[:q]).result
 @summary = @invoices.select("sum(balance) as balance_total").first

Except when the user specifies a field to sort. I get the SQL error:

 Column "project_name" is invalid in the ORDER BY clause because 
 it is not contained in either an aggregate function or the GROUP BY clause

Can I remove the sort from the scope? How?

Thanks

Adrienneadrift answered 28/2, 2012 at 23:24 Comment(1)
hmmm now ransack isn't liking the select on the result set, not sure it worked without the sort issue anymore.Adrienneadrift
I
202

You can call the reorder method with an empty string. E.g.:

Article.order('headline asc').to_sql
#=> "SELECT `articles`.* FROM `articles`  ORDER BY headline asc"

Article.order('headline asc').reorder('').to_sql
#=> "SELECT `articles`.* FROM `articles`"
Ivanna answered 28/2, 2012 at 23:34 Comment(5)
Note: If it feels better to you, can also call .reorder(nil).Negress
Another option is to use unscope(:order)Chancechancel
And yet another option is to use .except(:order).Tomasz
For the except(:order) option official documentation can be found at api.rubyonrails.org/classes/ActiveRecord/…Kaiserism
I feel uneasy about reorder('') and reorder(nil) feels so good. Is there a psychological name for this?Namely
C
-2

You can also use the unscoped class method in Rails 3:

class Post < ActiveRecord::Base
  default_scope :published => true
end

posts = Post.all #=> SELECT * FROM posts WHERE published = true

posts = Post.unscoped do
  Post.all #=> SELECT * FROM posts
end

In Rails 2 it was called with_exclusive_scope.

See https://github.com/rails/rails/commit/bd1666ad1de88598ed6f04ceffb8488a77be4385

Chemiluminescence answered 25/3, 2012 at 19:1 Comment(1)
A word of warning to people using unscoped: It does more than just reset the order! If you are using it in a chained ActiveRecord query, it will effectively remove the prior constraints from consideration. For example, Posts.first.comments.unscoped will return ALL Comment's, not just those associated with the first Post.Integrator

© 2022 - 2024 — McMap. All rights reserved.