Я выполняю такой запрос:
query = from q in MY.Model, preload: [:accoc], where: q.accoc_field in [10, 11]
Repo.all(query)
Это дает мне ошибку:
** (Ecto.QueryError) iex:32: field `accoc_field` in `where` does not exist in schema MY.Model in query:
Итак, в основном я пытаюсь написать такой запрос:
select * from my_model m join assoc a on m.assoc_id = a.id where a.assoc_field in (10, 11)
Я знаю, что могу написать вышеуказанный запрос, используя соединения в Ecto, но как мне это сделать при использовании предварительной загрузки?





Я надеюсь, что лучшим решением здесь будет прямое следование коду SQL.
Нам нужно присоединиться к другой таблице, поэтому нам нужно вызвать функцию Ecto.Query.join / 5 вместо предварительной загрузки.
Например, предположим, что нам нужно получить пользователей, которые создали сообщения с определенными разделами:
from u in User,
join: p in assoc(u, :posts),
where: p.section in ["elixir", "phoenix"],
select: u
После Repo.all для этого запроса мы получим список необходимых пользователей. Здесь, если мы хотим, чтобы пользователи заселять оставляли сообщения - мы можем вызвать Repo.preload
Ага, вот как вы это делаете. Простой тип join вместо preload. И обратите внимание, что у нас есть 2 переменные - u и p, поэтому мы можем выбирать, какие поля сравнивать в where.
Спасибо за ответ @Virvil, как упоминалось в моем вопросе, я не хочу использовать соединение с прямым запросом. Причина в том, что я хочу использовать ассоциации, определенные в схеме базы данных моей модели.