根据属性值计算关联

时间:2016-04-18 16:56:48

标签: ruby-on-rails postgresql

给定一个类,我想返回所有对象(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

1 个答案:

答案 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")