Rust Diesel:表及其联接上的BoxableExpressions泛型?

Rust Diesel:表及其联接上的BoxableExpressions泛型?,rust,rust-diesel,Rust,Rust Diesel,我正在尝试在运行时构造一些过滤器,这些过滤器可以应用于表隧道或隧道左侧外部连接(tunnel.id=connection.tunnel\u id) 这些表的定义如下: //定义隧道表和结构 桌子{ #[允许(未使用的_导入)] 使用diesel::sql_类型::*; 隧道(id){ id->BigInt, 名称->文本, } } #[派生(可查询、可识别、克隆、调试、PartialEq、Eq)] #[table_name=“tunnel”] 结构隧道{ 酒吧id:i64, 酒吧名称:Stri

我正在尝试在运行时构造一些过滤器,这些过滤器可以应用于表
隧道
隧道左侧外部连接(tunnel.id=connection.tunnel\u id)

这些表的定义如下:


//定义隧道表和结构
桌子{
#[允许(未使用的_导入)]
使用diesel::sql_类型::*;
隧道(id){
id->BigInt,
名称->文本,
}
}
#[派生(可查询、可识别、克隆、调试、PartialEq、Eq)]
#[table_name=“tunnel”]
结构隧道{
酒吧id:i64,
酒吧名称:String,
}
//定义连接表和结构
桌子{
#[允许(未使用的_导入)]
使用diesel::sql_类型::*;
连接(id){
id->BigInt,
隧道id->BigInt,
}
}
#[派生(调试、关联、可识别、可查询)]
#[table_name=“connection”]
#[主键(id)]
#[属于(隧道)]
发布结构连接{
酒吧id:i64,
酒吧编号:i64,
}
可接合!(连接->隧道(隧道id));
允许表格在同一查询中出现!(连接、隧道);
我可以编写一个函数,为单个表构造动态:

fn过滤器(
名称:&'static str,
)->Vec{
让mut在何处:Vec=Vec::new();
其中,push(Box::new(tunnel::name.eq(name));
在哪里
}
或加入:

pub类型TunnelJoinConnection=JoinOn<
参加
情商,
>;
fn滤波器(
名称:&'static str,
)->Vec{
让我们去哪里:Vec=
Vec::new();
其中,push(Box::new(tunnel::name.eq(name));
在哪里
}
请注意,这两个过滤器函数具有完全相同的函数体,因此我应该能够创建一个通用函数来实现这两个函数。但当我试图使它通用时,我得到了一个错误

fn过滤器(名称:&'static str)->Vec
哪里
T:上诉条款,
{
vec![Box::new(tunnel::name.eq(name))]
}
错误是

   |
85 |     vec![Box::new(tunnel::name.eq(name))]
   |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `diesel::SelectableExpression<T>` is not implemented for `tunnel::columns::name`
   |
   = note: required because of the requirements on the impl of `diesel::SelectableExpression<T>` for `diesel::expression::operators::Eq<tunnel::columns::name, diesel::expression::bound::Bound<diesel::sql_types::Text, &str>>`
   = note: required because of the requirements on the impl of `diesel::BoxableExpression<T, diesel::pg::Pg>` for `diesel::expression::operators::Eq<tunnel::columns::name, diesel::expression::bound::Bound<diesel::sql_types::Text, &str>>`
   = note: required for the cast to the object type `dyn diesel::BoxableExpression<T, diesel::pg::Pg, SqlType = diesel::sql_types::Bool>`
|
85 | vec![Box::new(tunnel::name.eq(name))]
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^未为“tunnel::columns::name”实现特征“diesel::SelectableExpression”`
|
=注意:由于'diesel::expression::operators::Eq'的'diesel::SelectableExpression'impl上的要求,因此需要`
=注意:由于'diesel::expression::operators::Eq'的'diesel::BoxableExpression'impl中的要求,因此需要`
=注意:强制转换为对象类型'dyn diesel::BoxableExpression'时必需`

最小示例,您可以克隆该最小示例并自己运行
货物检查
以查看错误。

只需一个小改动即可解决此问题:

fn过滤器(名称:&'static str)->Vec
哪里
柴油机::dsl::均衡器;
使用不属于柴油公共API的类型。这意味着这样的表达式可能会因任何更新而中断。使用公共API编写此类型的正确方法是

pub-type-TunnelJoinConnection=diesel::dsl::LeftJoin`

非常感谢您的全面回答。