Я создаю дизельные фильтры во время выполнения (используя подход, аналогичный этот вопрос). У меня есть функция 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
.
Минимальный пример здесь.