将MySQL查询转换为rails活动记录格式时出现问题

将MySQL查询转换为rails活动记录格式时出现问题,mysql,sql,ruby-on-rails,ruby,Mysql,Sql,Ruby On Rails,Ruby,我有下面的MySQL查询,它返回1列,名为points,填充了整数值 从选择FLOORsumcase中选择SUMpoints(正确=1时),然后在回答表中选择else 0结束/计数**100作为点,其中用户id=133按练习id分组,用户id作为点 我将其作为ruby on rails作用域进行了如下处理,这是一个没有最终总和的子查询: 作用域:基本点,->user\u id{选择'FLOORSUMcase when correct=1,然后将其他0结束/计数**100作为点。其中'user\u

我有下面的MySQL查询,它返回1列,名为points,填充了整数值

从选择FLOORsumcase中选择SUMpoints(正确=1时),然后在回答表中选择else 0结束/计数**100作为点,其中用户id=133按练习id分组,用户id作为点

我将其作为ruby on rails作用域进行了如下处理,这是一个没有最终总和的子查询:

作用域:基本点,->user\u id{选择'FLOORSUMcase when correct=1,然后将其他0结束/计数**100作为点。其中'user\u id=?',user\u id.组:exercise\u id,:user\u 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>]>

注意:这就是我可以执行@user.points的原因,因此我已将代码移动到用户模型中

尝试将您的范围更改为:

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

.group'exercise\u id'、'user\u id'也许?不知道ruby,但是那一组看起来很怪你的子查询看起来和rails生成的完全一样,你有没有试着在mysql中运行子查询?谢谢@BroiSatse,你的答案和你对代码作为一种方法变得更好的反馈都是正确的。我已经编辑了我的问题,以包含方法,而不是您可以执行的第一个[:points]。Pull:points.first,将不会有一个白创建的应答表实例。@kimmmo-Pull覆盖选择,因此它将不起作用。
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