Mein Code:Wie erstelle ich ein Composable wo mit Ecto?
defmodule Model1 do
use Ecto.Schema
import Ecto.Query
schema "model1" do
belongs_to :model2, Model2
end
def create_query do
Model1
|> join(:inner, [m1], m2 in assoc(m1, :model2))
end
def apply_where(query, %{name: name}) do
query
|> where([m1, m2], ilike(m2.name, ^name))
end
end
defmodule Model2 do
use Ecto.Schema
schema "model2" do
has_many :model1, Model1
field :name, :string
end
end
Wenn ich versuche:
param = %{name: "test"}
Model1.create_query |> Model1.apply_where(param) |> Repo.all
Es ist gut funktionieren. Aber ist es eine Möglichkeit, apply_query Funktion wie folgt zu codieren:
def apply_where(query, %{name: name}) do
query
|> where([m2], ilike(m2.name, ^name))
end
Und wenn meine Abfrage viele hat Klauseln beitreten? Muss ich alle verknüpften Schemata (Tabellen) in der Liste angeben (zuerst wo arg) [m1, m2, m3, ... mx], um jedes Mal ein Feld zu binden?
Danke für die Antwort Cody Poll! In meinem Fall verwende ich die Abfrage für zwei Momente: 1 - Suche Daten mit bestimmten Filtern (Where-Klausel) 2 - Daten durchsuchen, um drei Combobox-Filter im Bildschirm mit einer deutlichen Spalte und ohne Filter in Where-Klausel füllen. Ich versuche, dieselbe Abfrage zu verwenden: Für Combobox benutze ich die Ecto.Query.exclude Funktion, um Select, Order-By und Preload zu entfernen. Wenn Joins bearbeitet werden, habe ich Einfluss auf alle meine "apply_where" -Funktion. Composable-Abfragen sind nicht sinnvoll, da die Bindung positionsabhängig ist und nie benannt wird, wenn sie sich in verschiedenen Bereichen befindet (getrennte Funktionen). –