Применять дизельные фильтры к одному столу или присоединяться?

Я создаю дизельные фильтры во время выполнения (используя подход, аналогичный этот вопрос). У меня есть функция make_filters, которая генерирует фильтры для таблицы tunnel:

fn make_filters() -> Vec<Box<dyn BoxableExpression<tunnel::table, Pg, SqlType = Bool>>>

Я бы хотел, чтобы эти фильтры применялись либо к таблице tunnel, либо к объединению tunnel и connection. Нравится:

let mut query = tunnel::table.left_join(connection::table).into_boxed();

for filter in filters.as_sql_where() {
    query = query.filter(filter);
}

Но когда я пытаюсь, я получаю такую ​​ошибку:

^^^ the trait 
`diesel::AppearsOnTable<diesel::query_source::joins::JoinOn<diesel::query_source::joins::Join<tunnel::table, connection::table, diesel::query_source::joins::LeftOuter>, diesel::expression::operators::Eq<diesel::expression::nullable::Nullable<connection::columns::tunnel_id>, diesel::expression::nullable::Nullable<tunnel::columns::id>>>>` 

is not implemented for `dyn diesel::BoxableExpression<tunnel::table, diesel::pg::Pg, SqlType = diesel::sql_types::Bool>`

Это отлично работает, если запрос - всего лишь tunnel::table.into_boxed(), поэтому я думаю, что мне нужно обобщить подпись типа make_filters.

Минимальный пример здесь.


person Adam    schedule 01.06.2020    source источник


Ответы (1)


Поскольку фильтры могут применяться как к объединенным таблицам, так и к таблице tunnel, предпочтительное решение здесь - просто применить фильтры перед объединением таблиц. Так что что-то вроде этого должно работать нормально:

let mut query = tunnel::table.into_boxed();

for filter in filters.as_sql_where() {
    query = query.filter(filter);
}

let query = query.left_join(connection::table);
person weiznich    schedule 04.06.2020