2017-02-14 6 views
1

Ectoを使用しているElixir/Phoenixで実行している一連の複雑なクエリがあります。これらの目的は、新しいエントリの作成と前の行の更新の両方でこれらのクエリを機能させることです。これを実行するには、テーブルを更新するかどうかを定義する関数パラメータを使用することを想定します。Elixir Ecto関数のパラメータに基づくクエリの変更

defp get_chargebacks(%{user_id: user_id} = map, is_update \\ false) 

そしてis_update = true場合は、その後、私は追加したい:

# Retrieves the stats on the user chargebacks 
defp get_chargebacks(%{user_id: user_id} = map) do 
    query = 
     from u in Users, 
     left_join: c in ChargeBacks, on: [user_id: u.id], 
     where: u.id == ^user_id, 
     select: %{chargeback_amount_cents: sum(c.amount), chargeback_amount_count: count(c.user_id), chargeback_amount_currency: @default_currency}, 
     group_by: u.id 
    result = query 
    |> RepoBVCore.one 
    Map.merge(map, Map.put(result, :chargeback_amount_cents, Map.get(result, :chargeback_amount_cents) || 0)) 
end 

が、私はそれは次のようになるように機能を変更したい:例えば、今の私には、以下の機能を持っています機能(例えば)に追加where句:

where: c.amount > 100 

どのように私は条件付きでクエリステートメントを変更することが私のオリジナル機能を変化させることができますか?ありがとう。

答えて

4

Ecto.Query.where/3へのバインディングとして2つの名前のリストを渡すことにより、cにアクセスできます。それは元のクエリの最初joinをだからcは、そのリストの2番目の項目であろう(ソース・テーブルが最初のものであり、合流された後、それらを元のクエリに参加した順序でその):

defp get_chargebacks(%{user_id: user_id} = map, is_update \\ false) do 
    query = 
    from u in Users, 
    left_join: c in ChargeBacks, on: [user_id: u.id], 
    where: u.id == ^user_id, 
    select: %{chargeback_amount_cents: sum(c.amount), chargeback_amount_count: count(c.user_id), chargeback_amount_currency: @default_currency}, 
    group_by: u.id 
    query = 
    if is_update do 
     query |> where([u, c], c.amount > 100) 
    else 
     query 
    end 
... 
+0

すごく、ありがとう! – user2694306

関連する問題