2017-02-14 5 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: c.amount > 100 

가 어떻게 조건부 쿼리 문을 변경하는 내 원래의 기능을 변경할 수 있습니다 : 함수 (예를 들어)에 추가 where 절? 감사.

답변

4

Ecto.Query.where/3에 바인딩으로 2 개의 이름 목록을 전달하여 c에 액세스 할 수 있습니다. 원래 쿼리의 첫 번째 join을 이후 c 그 목록의 두 번째 항목이 될 것입니다 (소스 테이블이 처음이다의 조인입니다 후 그들은 원래의 질의에 가입 된 순서에서 해당) :

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