2016-09-06 25 views
0

我有一个Book型号,它的属性为costRails示波器:成本最高的返回记录

我想写一个查询,获取具有最高cost的所有book记录。

我需要考虑多于一个book可能分享的情况,确切的相同最高cost。在这种情况下,我抓住所有那些共享最高cost(不只是其中之一)的book记录。

示例数据库建设为books表:

id | cost 
1 4 
2 10 
3 7 
4 20 
5 15 
6 20 
7 3 

,所以我需要写的范围将返回 book记录:用4id记录,并与6的ID记录。

我认为答案涉及使用maximum方法,having方法和group方法,但我无法将所有部分放在一起作为范围。

这是我尝试过的一件事,但它不起作用。似乎仅返回具有相对于所有记录提供最高性价比最高cost的最后一条记录:

Book.group(:cost).having('books.cost = ?', (Book.maximum(:cost))) 
+0

你见过[这](http://stackoverflow.com/a/32351211/382982)回答? – pdoherty926

回答

1

该做的:

scope :most_expensive_books, -> {where(cost: self.maximum(:cost))} 

此范围执行两个查询:

  • 查询,以确定最大cost是什么。
  • 然后:它在where子句中使用该值最大值cost

的SQL看起来是这样的:

SELECT MAX("books"."cost") FROM "books" 
Book Load (0.3ms) SELECT "books".* FROM "books" WHERE "books"."cost" = ? [["cost", 20]] 
0

我会找出最大的价格,然后用select方法来抓住所有的书记录匹配最高价格。

max_cost = Book.map {|book| book.cost}.max 

Book.select {|book| book.cost == max_cost } 
+0

谢谢你的回答。你会碰巧知道如何把它变成一个范围? – Neil