【发布时间】:2014-10-26 20:28:49
【问题描述】:
TL;博士?请参阅编辑 2
我有一个小的 Rails 应用程序,其中包含人们可以玩的几种不同类型的游戏:它基于体育运动,因此他们可以每周挑选每场比赛的获胜者(模型 PickEm,属性 correct boolean nil 表示未完成的比赛),并预测特定球队比赛的结果(模型Guess,属性score 为整数,nil 表示未完成的比赛)。每个Userhas_manyPickEms 和Guesses。而且我正在尝试显示排名(correct/total - 总数都不是nil,score/total 可能)。
我发现我可以收集用户及其相关记录,但在尝试显示排名时,我发现每个用户都在触发另一个查询 - 随着用户群的增加,速度缓慢且不可持续。那是因为@user.pick_em_score 是pick_ems.where(correct: true).size 而@user.guess_Score 是guesses.where.not(score: nil).sum(:score)。所以我打电话给user.pick_em_score,它会运行那个查询。我觉得应该有一种方法可以一次获取每个 User 以及这些特定计数,而不是缓冲一大堆不必要的额外内容。
我需要什么:
-
User记录 -
User.pick_em_score(计算correct记录) -
User.pick_ems数NOT NULL -
User.guesses_score(由guesses.sum(:score)计算) -
User.guesses数NOT NULL
我在 Rails 的 ActiveRecord 助手中找到的大部分内容,尤其是与计算相关的内容,都是仅用于检索计算的。看起来我可能需要直接深入研究select() 等。但我无法让它工作。有人能指出我正确的方向吗?
编辑
澄清一下:我知道我可以将此信息写入User 模型,但这过于严格:下个赛季,我需要在User 中添加一个新列以供 那一年的结果等等。此外,这是第三级回调更新相关模型——Match 模型在保存时已经更新了相关的PickEms 和Guesses。 我正在寻找能够处理此信息的最简单的 ActiveRecord 查询或查询,如标题所示。理想情况下,一个查询可以返回上述信息,但如果需要几个,没关系。
我以前使用 PHP 直接在 MySQL 中工作,但这些技能已经生锈了(我想,在原始 MySQL 中,我会有几个子选择语句来帮助提取这些计数),我也喜欢 能够使用 Rails 的 ActiveRecord 助手等,并尽可能避免构建原始 SQL。
第二次编辑:
我似乎将其归结为 开始 工作的一次调用,但我正在编写大量 SQL。 它也很脆弱,IMO,并试图运行它失败了。看起来我只是将 Rails 中的百万单数 SELECT 查询直接推送到 SQL 中,但这可能仍然是一个进步。
User.unscoped.select('users.*',
'(SELECT COUNT(*) FROM pick_ems WHERE pick_ems.user_id = users.id AND pick_ems.correct) AS correct_pick_ems',
'(SELECT COUNT(*) FROM pick_ems WHERE pick_ems.user_id = users.id AND pick_ems.correct IS NOT NULL) AS total_pick_ems',
'(SELECT SUM(guesses.score) FROM guesses WHERE guesses.user_id = users.id AND guesses.score IS NOT NULL) AS guesses_score',
'(SELECT COUNT(*) FROM guesses WHERE guesses.user_id = users.id AND guesses.score IS NOT NULL) AS guesses_count' )
问题似乎是:有没有办法使用 Rails 而不是原始 SQL 将我们看到的 users.id 与这些子查询联系起来?或者只是……一般来说是一种更好的构建方式?
此外,我正在为WHERE 运行另一组SELECTs,这将取决于total_pick_ems 和guesses_count 是> 0,但由于我不能使用那些别名列,我必须再拨打SELECT 一次。
【问题讨论】:
-
您可能会使用数据库视图进行调查?我从未真正尝试过使用它们,但它们可以用模型在导轨中表示,就好像它们是一个实际的桌子一样。我会考虑制作一个基本上是您的 select 语句的数据库视图,然后将一个与用户相关联......尽管它们可能是 postgres 的东西......
标签: mysql ruby-on-rails ruby activerecord ruby-on-rails-4