2017-11-20 3 views
0

私はこのクエリを別の部分に分割し、必要に応じて構築する方法がありますか?私はこれのさまざまな部分が必要です。大きなEcto.Queryをより細かく分割するにはどうすればいいですか?

クエリは正常に動作しますが、コピーと貼り付けは異なる部分を変更するだけでは非常にクリーンなアプローチではありません。再利用が必要なブロックについては#と指摘しています。

def by_id(user_id, company_id, asset_id) do 

     # section 1 
     from a in Asset, 

     # section 2 
     join: acl in AccessList, on: acl.asset_id == a.id, 
     join: c in Company, on: acl.company_id == c.id, 
     join: u in User, on: acl.user_id == u.id, 

     # section 3 
     where: u.id == ^user_id and c.id == ^company_id 

     # section 4 
     and a.id == ^asset_id, 
     # section 5 
     select: %{ 
      asset_name: a.asset_name, 
      asset_id: a.id, 
      inserted_at: a.inserted_at 
      }, 

     # section 6 
     group_by: a.id, 

     # section 6 
     order_by: a.id 

    end 
+0

あなたは質問の答えを完全に変更しました。これは、SOのルールでは許可されていません。質問を元のバージョンに戻し、もしあれば別の質問をしてください。このサービスの目的は、あなたを個人的に支援するのではなく、知識ベースを構築することです。既に回答を受けている質問を編集することは、将来の読者にとってはかなり誤解を招きます。 – mudasobwa

+1

フェアポイント。完了しました。念押し有難う –

答えて

3

ドキュメントEcto.Queryから:

エクトクエリが構成可能です。たとえば、上記のクエリは、実際には2つの部分で定義することができます

# Create a query 
query = from u in User, where: u.age > 18 
# Extend the query 
query = from u in query, select: u.name 

あなたがかもしれない、言った:

q1 = from a in Asset 

q2 = from a in q1, 
    join: acl in AccessList, on: acl.asset_id == a.id, 
    join: c in Company, on: acl.company_id == c.id, 
    join: u in User, on: acl.user_id == u.id 

など

0

私はどのように広範囲にwrittenをしましたEctoクエリを構成する可能性があります。この手法とパターンマッチングを組み合わせると、複雑なクエリを簡単に記述できます。

ここでは、ユーザーが会社に照会されているシステムの例を示します。

def list_users(_user, "admin", params) do 
    User 
    |> filter_by_params(params |> Map.to_list()) 
end 

def filter_by_params(query, params) do 
    Enum.reduce(params, query, fn 
    tuple, query -> 
     filter_dataset(query, tuple) 
    end) 
end 

def filter_dataset(query, {"company_id", company_id}) do 
    query 
    |> join(:inner, [u], c in assoc(u, :company)) 
    |> where([_u, ..., company], company.id == ^company_id) 
end 

def filter_dataset(query, _no_matching_tuple), do: query 
関連する問題