bunu gibi yeniden kullanılabilir/composable sorgular yapabilirsiniz:İksir Ecto: Birden katılır ve yeniden kullanılabilir/composable sorgular Ecto yılında
defmodule AModel
#...
def anonymous(q), do: q |> where([am], is_null(am.user_id))
end
fazla örnek on this blog post bakınız. Ancak, çok sayıda birleştirmeyi kullanarak bir sorunla karşılaşıyorum.
en biz şuna benzer bir şema olduğunu varsayalım:
bu önerilen çözüm DModel aittir CModel için
- AModel BModel aittir makale gerçekten derin birleşimlerle çalışmaz:
q = DModel |> join(:inner, [dm], cm in assoc(dm, :c_models)) |> join(:inner, [_, cm], bm in assoc(cm, :b_models)) |> join(:inner, [_, _, bm], am in assoc(bm, :a_models)) |> AModel.anonymous
Sorgulama işlevleri ilk (birleştirme için ikinci) bağımsız değişkeni bir bağlama tablosu olarak alır. Önceki birleştirmeleri içerir ve siparişe katılmak için ne yazık ki sıkıdır.
Bizim örneğimizde,
anonymous
işlevi başlangıç tablosunu hedefler. Ancak, sorgu örneğinde, AModel 4. bağlayıcıdır ...Bu sipariş bağımlılığından kurtulmak için herhangi bir fikir veya teknik var mı?
DÜZENLEME:
Ben blog yazarı bir cevap olsun. Tablodaki pozisyondan ziyade bağlama işlemek için başka bir yol olmadığını söyledi. Ayrıca bu gerçeği vurgulayarak this article verdi.
Ama tanrı aşkına, eğer sipariş sadece önemliyse, neden üstüne isim oluşturabilirim?
Sormak için çok mu fazla: p?
Burada Ecto yaratıcılarından biri. Bu aslında çözülmesi çok zor bir sorundur çünkü isimleri bağlayıcı hale getirdiğimiz sürece, çatışmaların şansı büyük ölçüde artar, özellikle de kısayollar kullanmayı seviyoruz, tıpkı kullandığınız gibi, bm vb. Ama şimdiki meselenin aynı zamanda bir sıkıntı olduğunu biliyoruz, bunun için henüz iyi bir çözümümüz yok (henüz). –
Ciltleme listesinin üzerinde bir bindirme oluşturmayı deniyordum. 'birleştirmeyi 'yaparken, ciltleme pozisyonuna uyan bir sembol adı verebilirim. Daha sonra '' 'kullanarak, adın sağlanması için gerekli bağlamayı alabilirim. Şu anda böyle bir mekanik oluşturmak mümkün olduğunu düşünüyor musunuz? {query, ciltleme_adı} döndüren monad benzeri işlev kullanmayı düşünüyordum ... – ProxyGear
Bunu, Ecto'yu değiştirmeden başarabileceğinizi düşünmüyorum.Ben, anonim (q, pos), do: q |> gibi ([am: pos], is_null (am.user_id)) 'gibi pozisyonu verebilirsiniz, ama bu daha kötü IMO. –