【问题标题】:Active Record object based on group by count基于计数分组的 Active Record 对象
【发布时间】:2013-11-21 14:49:59
【问题描述】:

您好,我是 ROR 开发人员,正在使用带有 Postgres 数据库的 Rails 3.2.13。

我有两个模型:

Question
  attr_accessible :category, :is_active, :question_text, :question_type_id, :survey_id,
                  :user_id
  has_many :abusive_questions

还有

AbusiveQuestion
  attr_accessible :question_id, :user_id, :ipaddress, :posted_by

  belongs_to :question

由此我想得到计数大于特定值(例如:5)的 AbusiveQuestion。

我通过 rails 命令执行了以下操作

AbusiveQuestion.count(:group=>"abusive_questions.question_id")

得到了

=> {1=>1, 5=>3, 3=>1} 

对于这个结果,关键是question_id,值是计数,但是我想知道哪个值大于特定动态值(例如:2)。

请帮帮我。

【问题讨论】:

    标签: sql ruby-on-rails ruby ruby-on-rails-3 postgresql


    【解决方案1】:

    我想你会想在AbusiveQuestionjoin Question 然后使用selecthaving 来获得你想要的。

    类似:

    AbusiveQuestion.select('abusive_questions.*, count(question.id) as question_count').
      joins(:questions).
      group('abusive_questions.question_id').
      having('count(abusive_questions.question_id) > 5')
    

    【讨论】:

    • 感谢@teeg!
    • 感谢您的所有回复和@CDub。我在你的查询中遇到了一些问题,所以我利用你的想法来得到我的结果。如下 AbusiveQuestion.joins("join questions on questions.id = abusive_questions.question_id").select('abusive_questions.question_id,count(distinct(question_id) ) as question_count').group('abusive_questions.question_id').having("count(abusive_questions.question_id) > ?",limit)
    【解决方案2】:

    你可以使用有方法。 http://guides.rubyonrails.org/active_record_querying.html#having

    x = YOUR_DYNAMIC_COUNT
    AbusiveQuestion.group(:question_id).having("count_all > ?", x).count
    

    【讨论】:

    • having 子句的想法是正确的,但您不需要 .count 部分。 OP 需要返回的实际 AbusiveQuestion 对象,而不仅仅是返回的结果计数。 count_all 也没有意义; having 需要执行聚合函数来限制组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多