2015-10-16 4 views
5

に参加し、構成可能/再利用可能なクエリ:エリクシールエクト:複数あなたはそうのような再利用可能/構成可能なクエリを行うことができますエクトで

defmodule AModel 
    #... 

    def anonymous(q), do: q |> where([am], is_null(am.user_id)) 
end 

は、より多くの例on this blog postを参照してください。

ただし、複数の結合を使用すると問題が発生します。

のは、私たちはこのようになりますスキーマを持っているとしましょう:

  • アモデルはBModel
  • に属し
  • BModelが
  • CModelはこの中で提案

ソリューションをDModel属するをCModelに属し記事はディープジョインで実際には機能しません:

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 

クエリ関数は、バインディングテーブルの最初の引数(結合の2番目の引数)をとります。 これには以前の結合が含まれており、悲しいことに、順序を結合するのに窮屈です。

私たちの場合、anonymous関数は開始テーブルを対象にしています。 クエリの例では、AModelは4番目のバインディングです...

この依存関係を取り除くためのアイデアや技術はありますか?

EDIT:

私は、ブログの作者からの回答を得ます。 彼はテーブル内の位置よりもバインディングを扱う他の方法がないと言いました。 彼はまた、this articleにこの事実を強調しました。

しかし、神のために、順序だけが問題であれば、その上に名前をバインディングインデックスに関連付ける命名マッピングを作成できないのはなぜですか?

これはあまりにも多くの質問がありますか?

+1

Ectoクリエイターの1人です。これは実際に解決するのは非常に難しい問題です。なぜなら、名前をバインドする限り、am、bmなどを使用するようなショートカットを使用したいからです。しかし、我々は時事問題もまた迷惑であることを知っている、我々はちょうどそれ(まだ)のための良い解決策を持っていない。 –

+0

私はバインディングリストの上にオーバーレイを作成しようと考えていました。 'join 'を行うときに、バインド位置に一致するシンボル名を与えることができます。 次に、 'where'を使用して、名前を指定する必要なバインディングを抽出できます。このような整備士を作ることは現在可能だと思いますか? 私は{query、binding_names}を返すモナドのような関数を使用していると考えていました... – ProxyGear

+1

Ectoを変更せずに達成することはできません。あなたは 'def anonymous(q、pos)のように、位置を与えることができます:q |>ここで([am:pos]、is_null(am.user_id))'それは悪いIMOです。 –

答えて

-1

junction tablesを作成する可能性がありますか?


編集:私はおそらく私はちょっとあまりにも簡潔だったことがわかります。つまり、バックエンドにジャンクション・テーブルを作成してクエリを実行することができます。そのようにして、Ectoコードの結合を構築することについて心配する必要はありません。私の答えが少しはっきりしてくれることを願っています。

+0

ジャンクションがここでどのように役立つかわかりません。 詳細をお知らせください。 – ProxyGear

+0

私は少し詳細を与えるために私の答えを編集しました。 –

+0

ありがとう、編集していただきありがとうございます。しかし、これは次のことを意味します:a)プログラムの問題を解決するためのデータスキーマの複製/変更は間違っています。 b)それは本当にデータサイズのためにそれを余裕ができます – ProxyGear

関連する問題