簡體   English   中英

無法將我的MySQL查詢轉換為Rails活動記錄格式

[英]Trouble converting my MySQL query to rails active record format

我有以下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

我已經將其作為Rails作用域中的紅寶石處理到了以下幾點,這是沒有最終總和的子查詢:

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,因此我已將代碼移至用戶模型

嘗試將范圍更改為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM