2017-11-20 4 views
0

Gibt es eine Möglichkeit, dass ich diese Abfrage in verschiedenen Teilen aufteilen und so aufbauen kann, wie ich es brauche. Ich brauche verschiedene Teile davon.Wie man eine große Ecto.Query in kleineren Stücken bricht?

Abfrage funktioniert gut, aber kopieren und einfügen nur um verschiedene Teile zu ändern ist nicht sehr sauber Ansatz. Ich habe mit # für die Blöcke gezeigt, die ich wiederverwenden muss.

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

Sie haben die Frage vollständig geändert, nachdem sie beantwortet wurde: Dies ist durch Regeln von SO nicht zulässig. Bitte wandle die Frage zurück in ihre Originalversion und stelle eine andere Frage, falls du welche hast. Der Zweck dieses Dienstes ist es, Ihnen nicht persönlich zu helfen, sondern eine Wissensbasis aufzubauen. Bearbeiten von Fragen, die bereits Antworten erhalten, ist für die zukünftigen Leser ziemlich irreführend. – mudasobwa

+1

Messepunkt. Erledigt. Danke für die Erinnerung –

Antwort

3

Von Ecto.Query Dokumentation:

Ecto-Abfragen zusammensetzbare sind. Zum Beispiel kann die obige Abfrage tatsächlich in zwei Teile definiert werden:

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

Das heißt, Sie könnten:

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 

usw.

0

habe ich written ausführlich, wie Sie könnte Ecto-Abfragen erstellen. Wenn Sie diese Technik mit dem Mustervergleich kombinieren, können Sie komplexe Abfragen ziemlich einfach schreiben.

Hier ist ein Beispiel für ein System mit Benutzern auf der Grundlage von Unternehmen abgefragt werden.

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 
Verwandte Themen