将柴油过滤器应用于单个 table 或加入?
Apply diesel filters to either single table or join?
我在运行时生成 Diesel 过滤器(使用与 this question 类似的方法)。我有一个函数 make_filters
为 table tunnel
:
生成过滤器
fn make_filters() -> Vec<Box<dyn BoxableExpression<tunnel::table, Pg, SqlType = Bool>>>
我希望将这些过滤器应用于 table 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
的类型签名。
最小示例here。
由于过滤器可以同时应用于加入的 table 和 tunnel
table,这里的首选解决方案是在加入 [=14] 之前应用过滤器=]秒。所以像这样的东西应该可以正常工作:
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);
我在运行时生成 Diesel 过滤器(使用与 this question 类似的方法)。我有一个函数 make_filters
为 table tunnel
:
fn make_filters() -> Vec<Box<dyn BoxableExpression<tunnel::table, Pg, SqlType = Bool>>>
我希望将这些过滤器应用于 table 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
的类型签名。
最小示例here。
由于过滤器可以同时应用于加入的 table 和 tunnel
table,这里的首选解决方案是在加入 [=14] 之前应用过滤器=]秒。所以像这样的东西应该可以正常工作:
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);