2017-01-31 2 views
0

У меня есть ParentModel, ChildModel1 и ChildModel2. В ParentModel есть много ChildModel1, а ChildModel1 имеет много ChildModel2.Невозможно выполнить соединение в Ecto/Elixir

data = ChildModel2 
     |> join(:left, [chmd2], chmd1 in assoc(chmd2, :child_model1)) 
     |> where(ChildItem2, [a], a.child_model1.parent_model_id == ^get_some_value()) # get_some_value() returns a number 
     |> Repo.all() 

Вот исключение:

cannot use ^get_some_value() outside of match clauses 

Когда я заменить его буквальным

|> where(ChildItem2, [a], a.child_model1.parent_model_id == 123) 

я получаю:

undefined function where/4 

обновление

ошибка остается:

data = ChildModel2 
     |> join(:left, [chmd2], chmd1 in assoc(chmd2, :child_model1)) 
     |> where([a], a.child_model1.parent_model_id == 123) # [a] is ChildModel2 
     |> Repo.all() 

ошибка:

a.child_model1().parent_model_id() is not a valid query expression 
+0

У вас есть 'import Ecto.Query' в этом модуле? Вы получите ошибку «can not use^outside ...», если макрос не импортирован в этот модуль. – Dogbert

+0

Для второй ошибки, я думаю, вы хотите '|> где ([chmd2, chmd1], chmd1.parent_model_id == 123)'. – Dogbert

+0

@ Dogbert, используя оператор булавки, не будет работать с вызовом функции. – PatNowak

ответ

0

Вы не должны вводить в ChildItem2where, так как он уже передается в качестве первого аргумента в результате join.

Проблема вызвана ^ (оператор булавки), и она никогда не работает, когда она подключена к вызову функции - даже в case или cond. Попробуйте просто присвоить переменную значение get_some_value().

+0

'Проблема вызвана оператором^(pin), и она никогда не работает, когда она привязана к вызову функции - даже в случае или cond' - он делает это, я имел это до сих пор в немного другом запросе, и это хорошо работал. – Torito

+0

Я заменил 'get_some_value()' на литерал. Ошибка остается: 'a.child_model1(). Parent_model_id()' не является допустимым выражением запроса. – Torito

+0

Вы уверены, что вы правильно добавили эту ассоциацию? 'child_model1' и' parent_model_id' - это поля, а не функции. Вы добавили поле для 'child_model1' в схему и миграцию? Помните также, что 'assoc' не гарантирует, что ассоциация загружена. – PatNowak