[英]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.