我正在努力使用 Rails 的 ActiveRecord 来实现以下查询。
我的架构或多或少是这样的:
我有一个 table 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......)
有人可以解释一下我在这里缺少什么。
谢谢你。