1

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

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

我有一个 table 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......)

有人可以解释一下我在这里缺少什么。

谢谢你。

4

0 回答 0