0
@violators = User.includes(:violation).select('users.id, violations.id')
  .group('users.id, violations.id').having("COUNT(violations.user_id) >= ?", 5)
  .order("COUNT(violations.user_id) desc")

每个用户has_many违规。通过上面的查询,我可以对违规次数最多的用户进行排序,但我只想查看违规次数为 5 次或更多的用户。当我插入 5 时,尽管有超过 5 次违规的用户,但什么都没有显示。当我在其中输入 1 时,所有违规用户都会出现!

更新:

我无法像我之前建议的那样对违规最多的用户进行排序。实际的违规计数可能存在问题。它以某种方式没有捕获它们。虽然当我检查控制台并尝试运行 -user.violation.count 时,它给了我准确的计数。

4

1 回答 1

6

您需要joins在请求中包含:

@violators = User.joins(:violations).includes(:violations)      
  .group('user_id').having('COUNT(*) >= ?', 5)
  .order('COUNT(*) desc')

我已经在我的模型ChampionshipMatch(冠军赛has_many)上对其进行了测试:

Championship.joins(:matches).includes(:matches)
  .group('championship_id').having('count(*) >= ?', 5).order('count(*) DESC').all

SQL 请求:

 SQL (0.5ms)  SELECT "championships"."id" AS t0_r0, "championships"."created_at" AS t0_r4, "championships"."updated_at" AS t0_r5, "matches"."id" AS t1_r0, "matches"."championship_id" AS t1_r1, "matches"."created_at" AS t1_r9, "matches"."updated_at" AS t1_r10, "matches"."result" AS t1_r11, "matches"."map_token" AS t1_r12 FROM "championships" INNER JOIN "matches" ON "matches"."championship_id" = "championships"."id" GROUP BY championship_id HAVING count(*) >= 5 ORDER BY count(*) DESC
于 2013-06-22T17:12:46.460 回答