我正在努力使用Rails的ActiveRecord来实现以下查询。
我的架构或多或少是这样的:
我有一个表quests
,该表与solutions
有一对多的关系(即。quest has_many solutions
和solution belongs_to quest
)。
solutions
也与guilds
有一对多关系(即。guild has_many solutions
和solution 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......)
有人可以解释一下我在这里缺少的东西。
谢谢。