ActiveRecord按关联的模型两级别对模型列表进行排序

时间:2016-04-02 19:34:55

标签: ruby-on-rails ruby activerecord

我有一个rails应用程序,其中包含发布食谱的用户。人们可以使用评级将评论发布到食谱。我想按照发布的食谱收到的评级的平均值对用户列表(索引操作)进行排序它们。
我已经使用这个来排序recpes列表了:

@courses = @recipes.joins(:comments).group('recipes.id').order('AVG(comments.rating)').reverse_order

我如何为用户做类似的事情? 我试图通过读取rails指南和apidock使用连接,组等来做到这一点,但仍然无法解决这个问题。

1 个答案:

答案 0 :(得分:0)

试试这个,不确定它是否完全正确。希望它对你有所帮助。

User.joins(recipes: [:comments]).group('users.id').order('AVG(comments.rating) DESC')

更新

我的模特是用户,测验,问题。令我困惑的部分是你对用户的定义。发布课程的用户以及在同一个表或单独表中发表评论的用户是?我嘲笑的关系就是这个,我认为这几乎与你的模型完全相同:

  1. 用户has_many测验,用户has_many问题。
  2. Quiz has_many questions,belongs_to user。
  3. 问题属于一个用户,属于一个问题。
  4. 在这种情况下,如果我@users = User.joins(quizzes: [:questions]).group('users.id').order('AVG(questions.easy_count) DESC'),我得到的结果是,结果@users是拥有由easy_count(在您的案例评级中)排序的测验的用户的列表属于相应的测验。

    代码

    的说明

    User.joins(quizzes: [:questions]) simple为您提供了所有有问题的用户行(在您的情况下应该是课程),这些用户有问题(在您的情况下应该是评论)。考虑下面的例子:

    1. user1有quiz1
    2. quiz1有问题1和问题2
    3. User.joins(quizzes: [:questions])获得的结果将返回两个重复的user1行(因为user1通过quiz1与两个问题相关)

      然后group('users.id')User.joins(quizzes: [:questions])的结果分组为user.id(您希望获得用户列表)

      所以到目前为止,你得到的是非常简单的,它是一个有测验的用户列表,这些测验需要至少有一个问题,我很确定它是所有者的用户测验,而不是问题的所有者用户。

      然后在结尾处按平均easy_count个问题排序此列表(在您的情况下,评论评级)