我正在尝试制作某种关键表,将其中一个模型表(主)与它的多对多关系(rel1,rel2,...)连接起来,聚合相关模型的数量。我希望它产生类似于以下的 SQL:
SELECT
masters.id,
rel1.rel1_count,
rel2.rel2_count,
...
FROM
masters
LEFT JOIN
(SELECT
masters.id,
count(rel1s_masters.*) as rel1_count
FROM
masters
LEFT OUTER JOIN
rel1s_masters
ON
rel1s_masters.master_id = master.id
GROUP BY
masters.id) rel1
ON
rel1.id = masters.id
LEFT JOIN
(SELECT
...
...) rel2
ON
rel2.id = masters.id
...
我可以使用 Squeel 轻松创建内部查询:
rel1_subq = Master \
.joins{ rel1s_masters.outer } \
.select{ masters.id.as id } \
.select{ rel1s_masters.count.as rel1_count } \
.group{ masters.id }
rel2_subq = Master \
.joins{ ... } \
.select{ ... } \
...
但是现在,我不确定如何以一种好的方式将这些列子查询组合成一个汇总表。我得到的最接近的使用将子查询转换为 sql 并以这种方式处理它们:
stats = Master \
.select{ masters.id } \
.joins{ ... } \
.joins{ ", (#{rel1_subq.to_sql}) as rel1" } \
.where{ rel1.id == masters.id } \
.select{ rel1.rel1_count.as rel1_count } \
.joins{ ", (#{rel2_subq.to_sql}) as rel2" } \
.where{ ... } \
.select{ ... }
有没有更好的方法来获得相同的结果?
UPD:看起来在这种情况下,采用 Counter Cache 方法是个好主意:
http://railscasts.com/episodes/23-counter-cache-column
但问题仍然有效:是否有一种平滑自然的方式来使用 squeel 进行子查询连接?