に参加し、構成可能/再利用可能なクエリ:エリクシールエクト:複数あなたはそうのような再利用可能/構成可能なクエリを行うことができますエクトで
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にこの事実を強調しました。
しかし、神のために、順序だけが問題であれば、その上に名前をバインディングインデックスに関連付ける命名マッピングを作成できないのはなぜですか?
これはあまりにも多くの質問がありますか?
Ectoクリエイターの1人です。これは実際に解決するのは非常に難しい問題です。なぜなら、名前をバインドする限り、am、bmなどを使用するようなショートカットを使用したいからです。しかし、我々は時事問題もまた迷惑であることを知っている、我々はちょうどそれ(まだ)のための良い解決策を持っていない。 –
私はバインディングリストの上にオーバーレイを作成しようと考えていました。 'join 'を行うときに、バインド位置に一致するシンボル名を与えることができます。 次に、 'where'を使用して、名前を指定する必要なバインディングを抽出できます。このような整備士を作ることは現在可能だと思いますか? 私は{query、binding_names}を返すモナドのような関数を使用していると考えていました... – ProxyGear
Ectoを変更せずに達成することはできません。あなたは 'def anonymous(q、pos)のように、位置を与えることができます:q |>ここで([am:pos]、is_null(am.user_id))'それは悪いIMOです。 –