从ActiveRecord范围中删除订单


68

我正在使用Rails ransack(https://github.com/ernie/ransack)来允许用户过滤和排序一些记录。我使用传统方法获得了经过过滤和排序的记录。

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

现在我想获得一些摘要信息,所以我有

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

用户指定要排序的字段时除外。我收到SQL错误:

 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

我可以从示波器中删除排序吗?怎么样?

谢谢


hmmm现在ransack不喜欢结果集上的select,因此不确定在没有排序问题的情况下它是否可以工作。
jrhicks 2012年

Answers:


160

您可以使用空字符串调用reorder方法。例如:

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` "

16
注意:如果您觉得更好,也可以致电.reorder(nil)
pdobb '16

21
另一种选择是使用unscope(:order)
Rene

9
还有另一个选择是使用.except(:order)
justisb

对于except(:order)选择官方文档可以在这里找到api.rubyonrails.org/classes/ActiveRecord/...
Jignesh Gohel

我感到不安reorder('')reorder(nil)感觉很好。为此有心理名称吗?
卡齐姆·扎伊迪

-4

您还可以unscoped在Rails 3中使用class方法:

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

在Rails 2中被称为with_exclusive_scope

参见https://github.com/rails/rails/commit/bd1666ad1de88598ed6f04ceffb8488a77be4385


26
警告使用的人unscoped:它不仅可以重置订单!如果在链接的ActiveRecord查询中使用它,它将有效地消除先前考虑的约束。例如,Posts.first.comments.unscoped将返回所有评论,而不仅仅是与第一个帖子相关的评论。
Drew Dara-Abrams 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.