Rails作用域:返回开销最大的记录



我有一个具有cost属性的Book模型。

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

我需要考虑多个book可能共享完全相同的最高cost的场景。在这种情况下,我抓取所有共享最高costbook记录(而不仅仅是其中一条)。

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)))

这样做:

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

这个范围执行两个查询:

  • 一个查询来确定cost的最大值是多少。
  • Then:它使用作为where子句中的最大cost

SQL看起来像这样:

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

我将找出最大价格,然后使用select方法获取与最大价格匹配的所有图书记录。

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

最新更新