2017-02-14 42 views
1

我有一系列複雜的查詢,我正在使用Ecto在Elixir/Phoenix中運行。這些目標是使這些查詢適用於創建新條目和更新以前的行。爲此,我設想使用一個函數參數來定義我們是否正在更新表格。例如,現在我有以下功能:Elixir Ecto根據函數參數改變查詢

# 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 

我想改變的功能,因此,這將是如下:

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

如果is_update = true然後我會想添加一個另外where條款的函數(例如):

where: c.amount > 100 

我怎樣才能改變我原來的功能,有條件改變查詢語句?謝謝。

回答

4

您可以通過傳遞2個名稱列表作爲綁定到Ecto.Query.where/3來訪問cc將在該列表中的第二項,因爲它是在原來的查詢中的第join(源表是第一位的,連接是後的順序,他們在原來的查詢參加):

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