我有一个具有cost
属性的Book
模型。
我想编写一个查询,该查询捕获具有最高cost
的所有book
记录。
我需要考虑多个book
可能共享完全相同的最高cost
的场景。在这种情况下,我抓取所有共享最高cost
的book
记录(而不仅仅是其中一条)。
books
表的数据库示例:
id | cost
1 4
2 10
3 7
4 20
5 15
6 20
7 3
所以我需要写的作用域将返回两个 book
记录:4
的id
记录和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 }