2016-10-04 1 views
0

У меня есть три модели 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] 

ответ

0

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

query = 
    from t1 in Table1, 
    join: t12 in Table1to2, on: t12.table1_id == t1.id, 
    join: t2 in Table2, on: t12.table2_id == t2.id, 
    where: t12.main == :true and t1.id == ^table1_id, 
    preload: [table2: t1], 
    select: t1 

result = Repo.one(query) 
+0

Верно, и это то, что я сейчас делаю в данный момент. Было бы здорово, если бы был способ сделать это без явных запросов, хотя, поскольку это PITA, когда мне приходится предварительно загружать/связывать другие запросы. Ecto поддерживает пользовательские модели HABTM, которые заставляют меня чувствовать, что должен быть способ сделать это чисто. – Secret

 Смежные вопросы

  • Нет связанных вопросов^_^