首页 > 解决方案 > 将柴油过滤器应用于单个表或加入?

问题描述

我在运行时生成柴油过滤器(使用与此问题类似的方法)。我有一个make_filters为表生成过滤器的函数tunnel

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

我希望将这些过滤器应用于表tunneltunneland的连接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.

这里的最小例子。

标签: rustrust-diesel

解决方案


由于过滤器可以同时应用于连接表和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);

推荐阅读