【问题标题】:ActiveRecord Order the list of a model by associated model two levelsActiveRecord 按关联模型两个级别对模型列表进行排序
【发布时间】:2016-04-06 07:54:01
【问题描述】:

我有一个 Rails 应用程序,其中有发布食谱的用户。人们可以将 cmets 发布到带有评级的食谱。我想通过发布的食谱收到的平均评级对用户列表(索引操作)进行排序他们。
我已经使用这个对recpes列表进行了排序:

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

我怎样才能为用户做类似(或不做)的事情?
我尝试通过阅读 rails guides 和 apidock 来使用 joins、group 等来做到这一点,但仍然无法弄清楚。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

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

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

    更新

    我的模型是用户、测验、问题。让我很困惑的部分是您对用户的定义。发布课程的用户和发表评论的用户是在同一个表中还是在单独的表中?我嘲笑的关系是这样的,我认为这和你的模型几乎完全一样:

    1. 用户有_many 个测验,用户有_many 个问题。
    2. 测验有_许多问题,属于_用户。
    3. 问题属于_用户,问题属于_测验。

    在这种情况下,如果我做@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 有 question1 和 question2

    你从User.joins(quizzes: [:questions])得到的结果会返回给你user1的两个重复行(因为user1通过quiz1与两个问题相关)

    然后group('users.id')User.joins(quizzes: [:questions]) 的结果按user.id 分组(你想获取用户列表)

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

    然后在最后你按平均 easy_count 问题对这个列表进行排序(在你的情况下是 cmets 的评分)

    【讨论】:

    • 这样做是根据用户发布评论对 cme​​ts 进行分组。评论属于用户和课程(此处用户是发布评论的人)。 Course has_many cmets, User has_many courses.hop 这有帮助
    • 您能提供给我您的架构表吗?这样我就可以轻松地设置它和你一样,如果你有一个seed.rb,那就太好了
    • 由于你没有给我提供表格,我只是模拟了一个类似的模型关系。在我的回答中查看更新
    • 生成的sql是SELECT "users".* FROM "users" INNER JOIN "quizzes" ON "quizzes"."user_id" = "users"."id" INNER JOIN "questions" ON "questions"."quiz_id" = "quizzes"."id" GROUP BY "users"."id",这也证明它是用户发布测验(在你的情况下是课程),而不是用户发布问题(在你的情况下是评论)
    • 如果您想验证结果,您可以在控制台中运行以下代码:sql = %q(SELECT "users".* FROM "users" INNER JOIN "courses" ON "courses"."user_id" = "users"."id" INNER JOIN "comment" ON "comment"."course_id" = "courses"."id" GROUP BY "users"."id" ORDER BY AVG(comments.rating) DESC), ActiveRecord::Base.connection.execute(sql)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    相关资源
    最近更新 更多