【问题标题】:Ruby on Rails - Order by count of related table recordsRuby on Rails - 按相关表记录数排序
【发布时间】:2019-01-30 15:56:43
【问题描述】:

我正在尝试进行查询,但似乎无法破解它的语法。因此,我需要获取本月最近的调查,将其限制为 5,然后按作为调查响应的相关表的计数进行排序。因此,如果一项调查有 8 个回复和另外 4 个回复,则有 8 个回复将显示在顶部。

我设置了一个范围来查找当月的调查,但要么我需要放弃它以进行更复杂的查询,要么找到一种方法以最大 survey.response_count 对其进行排序。

这是我得到的最接近的,但仍然不正确。

@sorted_active_surveys = Survey.joins(:survey_responses).group(:survey_id).order('COUNT(survey_responses.survey_id) DESC')

如果我尝试结合范围,created_at 日期会变得模棱两可并出现错误。

调查.rb

scope :for_month, ->(date) { where("MONTH(created_at) = ?", date.month).limit(5) }

这也会产生同样的错误

    scope :for_month, ->(date) { where("MONTH(survey.created_at) = ?", date.month).limit(5) }

任何帮助将不胜感激。

【问题讨论】:

  • 在您上一个代码示例中,我相信您想说surveys.created_at 而不是survey.created_at。这可能不是你的问题,但我想指出这一点。
  • 你是对的,我需要在那里使用复数。我不会写很多这样的查询,所以试图弄清楚。谢谢

标签: mysql ruby-on-rails-4


【解决方案1】:

这不保持范围,但似乎正确地按响应计数排序并将日期保持在当月内。

Survey.where('surveys.created_at > ? AND surveys.created_at < ?', Time.now.beginning_of_month, Time.now.end_of_month).joins(:survey_responses).group(:survey_id).order('COUNT(survey_responses.survey_id) DESC')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    相关资源
    最近更新 更多