2017-12-20 7 views
0

postscommentsおよびvotesのテーブルがあるとします。Ectoでは、集計クエリを事前にロード

votesテーブルは、directionカラムが1,0、-1のいずれかになります。

は、私はまた、すべての記事と数コメントの、および各ポストのためvotes.direction合計を照会します。

これは、Ectoのサブクエリとして実現可能ですか?Postモデルで合成可能なクエリを使用するのが理想的ですか?

def count_comments(query) do 
    from p in query, 
    left_join: c in assoc(p, :comments), 
    select: {p, count(c.id)}, 
    group_by: p.id 
end 

def get_score(query) do 
    from l in query, 
    left_join: v in assoc(p, :votes), 
    select: {p, sum(v.direction)}, 
    group_by: p.id 
end 

しかし、私はこのエラーを取得するように私はこれらのクエリの両方を構成することができません:

現在、私が持っているものがある

(Ecto.Query.CompileError) only one select expression is allowed in query

答えて

1

あなたのコードは、上の失敗何不明であるが、それ

from p in Post, 
    left_join: c in assoc(p, :comments), 
    left_join: v in assoc(p, :votes), 
    group_by: p.id, 
    select: {p, count(c.id), sum(v.direction)} 

Query compisitionは「終了していない」クエリで許可されている可能性がありますつまり、質問の場合、select句がありません(テストされていないため、構造によって多少異なる場合があります)。

with_comments = 
    from p in Post, 
    left_join: c in assoc(p, :comments), 
    group_by: p.id 

with_score_and_comments = 
    from [p, c] in with_comments, 
    left_join: v in assoc(p, :votes), 
    group_by: p.id 

result = 
    from [p, c, v] in with_score_and_comments, 
    select: {p, count(c.id), sum(v.direction)} 
+0

これはうまくいくようです。別の質問の種類ですが、このクエリの関連モデルをプリロードする最も簡単な方法は何ですか。例えば。投稿にユーザーがいるとしたら、ユーザーが投稿に読み込まれるようにするにはどうすればよいですか? – harryg

+0

'Ecto'は良い文書を持っていますbtw https://hexdocs.pm/ecto/search.html?q=preload – mudasobwa

関連する問題