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 ?