У меня есть три модели Table1
, Table2
и Table1to2
. Table1to2
является объединение таблицы из Table1 в Table2, со схемой Table1 и Table2 являются:Добавить предложение where в таблице соединений ecto assoc
schema "table1" do
many_to_many :table2, Table2, join_through: Table1to2
end
schema "table2" do
many_to_many :table1, Table1, join_through: Table1to2
end
Главное, что мой присоединиться к таблице, Table1to2
имеет столбец/поле, которое мне нужно запросить против. По сути, я хочу сделать что-то вроде этого:
Repo.get!(Table1, id) |> Repo.preload(table2: (from j in Table1to2, where: [main: true]))
Это понятно, не работает, потому что нет никакой прямой Defined ассоциации из Table1 в Table1to2. Делая это, однако:
Repo.get!(Table1, id) |> Repo.preload(table2: (from j in Table2, where: [main: true]))
результаты этого запроса:
from p0 in Table1,
join: u in Table1to2,
on: u.table1_id == p0.id,
join: p1 in Table2,
on: u.table2_id == p1.id,
where: p1.main == true, #should be u.main == true
where: p0.id == ^"2",
select: p0,
preload: [table_2: p1]
Верно, и это то, что я сейчас делаю в данный момент. Было бы здорово, если бы был способ сделать это без явных запросов, хотя, поскольку это PITA, когда мне приходится предварительно загружать/связывать другие запросы. Ecto поддерживает пользовательские модели HABTM, которые заставляют меня чувствовать, что должен быть способ сделать это чисто. – Secret