2015-10-16 13 views
5

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:

  • BModel aittir
  • CModel
  • 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?

    +1

    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). –

    +0

    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

    +1

    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. –

    cevap

    -1

    Belki bazı junction tables yaratın?


    DÜZENLEME: Belki de biraz fazla ters olduğunu görebiliyorum. Yani arka uçta birleşme tabloları oluşturabilir ve sonra bunları sorgulayabilirsiniz. Bu şekilde, Ecto kodunuzdaki birleşmeleri oluşturmak için endişelenmenize gerek yoktur. Umarım cevabımı biraz daha netleştirir.

    +0

    Bağlantıların burada nasıl yardımcı olabileceğini anlamıyorum. Daha fazla ayrıntı verebilir misiniz? – ProxyGear

    +0

    Cevabımı biraz daha detay vermek için düzenledim. –

    +0

    Tamam, düzenleme için teşekkürler. Bununla birlikte, şu anlama gelir: a) Programatik bir sorunu çözmek için veri şemasını çoğaltın/değiştirin, yanlış geliyor. b) Veri boyutu – ProxyGear

    İlgili konular