2016-09-06 64 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