6

Ecto では、次のように再利用可能/構成可能なクエリを作成できます。

defmodule AModel
  #...

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

このブログ投稿でその他の例を参照してください。

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

次のようなスキーマがあるとします。

  • AModel は BModel に属します
  • BModel は CModel に属します
  • CModel は DModel に属します

この記事で提案されている解決策は、深い結合では実際には機能しません。

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 番目のバインディングです...

この順序の依存関係を取り除くためのアイデアやテクニックはありますか?

編集 :

ブログ主から返事が来ました。彼は、テーブル内の位置によってバインディングを処理するネイティブな方法は他にないと私に言いました。彼はまた、この事実を強調するこの記事を提供しました。

しかし、神のために、順序のみが重要な場合、 name を binding index に関連付ける名前付けマッピングをその上に作成できないのはなぜですか?

これは質問するには多すぎますか :p ?

4

2 に答える 2

-1

多分いくつかのジャンクションテーブルを作成しますか?


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

于 2015-10-16T12:40:45.533 に答える