在Squeel中加入子查询

时间:2012-07-06 12:17:35

标签: ruby-on-rails ruby squeel

我正在尝试制作某种关键表,加入其中一个模型表(master)与它的多对多关系(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 :在这种情况下看起来最好采用计数器缓存方法:

http://railscasts.com/episodes/23-counter-cache-column

但这个问题仍然有效:是否有一种顺畅的自然方式可以将子查询与squeel连接起来?

0 个答案:

没有答案