无法将我的MySQL查询转换为rails活动记录格式

时间:2014-05-21 14:32:10

标签: mysql sql ruby-on-rails ruby

我有以下MySQL查询,它返回1列,称为填充了整数值的点

SELECT SUM(points) FROM (SELECT FLOOR((sum(case when correct=1 then correct else 0 end)/COUNT(*))*100) as points FROM answersheets WHERE user_id = 133 GROUP BY exercise_id, user_id) as points

我已经把它作为一个ruby on rails scope得到了以下点,这是没有最终总和得到总数的子查询:

scope :base_points, ->(user_id) { select('FLOOR((SUM(case when correct=1 then correct else 0 end)/COUNT(*))*100) as points').where('user_id = ?', user_id).group(:exercise_id, :user_id) }

但那只是返回

 2.1.0 :073 > p = Answersheet.base_points(133)
 Answersheet Load (0.4ms)  SELECT FLOOR((SUM(case when correct=1 then correct else 0 end)/COUNT(*))*100) as points FROM `answersheets` WHERE (user_id = 133) GROUP BY exercise_id, user_id
 => #<ActiveRecord::Relation [#<Answersheet id: nil>, #<Answersheet id: nil>, #<Answersheet id: nil>]>

什么可能导致rails控制台和mysql之间的区别?我的猜测是我的格式错误

基于以下所选答案的方法

def points
    query = Answersheet.select('FLOOR((SUM(case when correct=1 then correct else 0 end)/COUNT(*))*100) as points').where('user_id = ?', self.id).group(:exercise_id, :user_id)
    return query.sum(&:points)
end

注意:我可以这样做@ user.points所以我已经将代码移到了用户模型

1 个答案:

答案 0 :(得分:0)

尝试将范围更改为:

scope :base_points, ->(user_id) { select('FLOOR((SUM(case when correct=1 then correct else 0 end)/COUNT(*))*100) as points').where('user_id = ?', user_id).group(:exercise_id, :user_id).first[:points] }

我认为最好把它写成一种方法:

class Answersheet < ActiveRecord::Base

  def self.base_points(user_id)
    scoped.select('FLOOR((SUM(case when correct=1 then correct else 0 end)/COUNT(*))*100) as points').
      where('user_id = ?', user_id).
      group(:exercise_id, :user_id).
      first[:points]
  end