给定一个类,我想返回所有对象(index
),这些对象按照它们与特定属性的关联数排序。
例如,让我们说User has_many :fish
我想显示所有用户的列表,并根据他们:fish
color: :red
的数量来排序{假设&# 39;是枚举/整数值)
拥有0条红色鱼或0条鱼的用户仍应显示在桌面上,但排在最底层。
-- User -- | - # of fish - | - # of red fish -
2 | 10 | 10
5 | 25 | 7
6 | 11 | 6
7 | 18 | 5
1 | 27 | 4
3 | 23 | 1
4 | 3 | 0
8 | 0 | 0
到目前为止,我已经设法使用left_join
宝石按照他们拥有的鱼的数量对用户进行排序,但我无法按该模型的属性进行排序。
这就是我按照鱼的数量排序的方法:
@users = User.left_join(:fish).group("user.id").order("count(user.id) desc")
任何帮助都会很棒!我假设这很简单,但我也会显示这些数据,所以暂时存储这些数据的任何方式都会很棒! (我假设使用select
并将计数设置为变量)
编辑:
解决方案,感谢Anthony E.
@users = User.select("users.*")
.joins("LEFT JOIN fishes ON fishes.user_id = users.id")
.where(fishes: { color: Fish.colors[:red] } )
.group("users.id").order("COUNT(fishes.id) DESC")
.page(params[:page]) // To work with Kaminari/pagination
答案 0 :(得分:1)
怎么样:
User.select("user.*, COUNT(fish.id) AS fish_count")
.joins(:fish)
.where(fish: { color: "red" })
.group("user.id")
.order("fish_count DESC")
好处是你可以在返回的返回集合中的每个对象上调用fish_count
,因为它在select
修改强>
要包含0 fish的用户,请使用LEFT JOIN并修改where子句:
User.select("user.*, COUNT(fish.id) AS fish_count")
.joins("LEFT JOIN ON fish.user_id = user.id")
.where("fish.color = 'red' OR fish.color IS NULL")
.group("user.id")
.order("fish_count DESC")