获取外键轨激活记录的最大值

时间:2013-10-24 05:37:50

标签: sql ruby-on-rails activerecord

我正在努力使用Rails的ActiveRecord来实现以下查询。

我的架构或多或少是这样的:

我有一个表quests,该表与solutions有一对多的关系(即。quest has_many solutionssolution belongs_to quest)。

solutions也与guilds有一对多关系(即。guild has_many solutionssolution belongs_to guild)。

solutions有一个score整数列。

我想要的是获得每个公会的最佳分数的解决方案。 在SQL中我想我会写这样的东西。

SELECT quests.id, solutions.*, max(solutions.score) 
FROM quests 
INNER JOIN solutions ON solutions.quest_id = quests.id 
WHERE quests.id IN (1, 2, 3 or whatever I want to fetch)
GROUP BY solutions.guild_id, quests.id;

由于我在单个页面上显示了很多这些内容,因此我尝试将其作为Quest类中的关系工作,以便我可以使用类似Quest.includes(:best_solutions).limit(40)的内容预取这些内容

这是我尝试过的(在Quest模型中)。

has_many :best_solutions,
       -> { select('solutions.*, max(solutions.score)')
           .group('solutions.guild_id', 'solutions.quest_id')
           .readonly },
       class_name: 'Solution',
       foreign_key: 'quest_id'
当我尝试Quest.first.best_solutions时,我感到非常高兴,这让我产生了:

SELECT solutions.*, max(solutions.score) 
FROM "solutions" 
INNER JOIN "quests" 
ON "quests"."id" = "solutions"."quest_id" 
WHERE "solutions"."quest_id" = ? 
GROUP BY solutions.guild_id, quests.id 

然而,当我尝试将其与includes结合使用时,它给我的查询与我想要获得的内容无关。例如,Quest.includes(:best_solutions).load已产生

SELECT solutions.*, max(solutions.score) 
FROM "solutions" 
WHERE "solutions"."quest_id" IN (1, 2......)

有人可以解释一下我在这里缺少的东西。

谢谢。

0 个答案:

没有答案