1

モデルテーブルの1つ(マスター)を多対多の関係(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 で行うスムーズで自然な方法はありますか?

4

0 に答える 0