rust - 将柴油过滤器应用于单表还是连接表?

标签 rust rust-diesel

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

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

我希望将这些过滤器应用于表tunneltunnelconnection 的连接。像这样:

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 .

最佳答案

由于过滤器可以应用于连接表和隧道表,因此此处的首选解决方案是在连接表之前应用过滤器。所以像这样的东西应该可以正常工作:

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);

关于rust - 将柴油过滤器应用于单表还是连接表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62140096/

相关文章:

rust - 如何运行特定模块下的所有测试功能?

database - rust -我可以使这个dsl​​::find()函数更通用吗?

heroku - 将 Rust 应用程序部署到 Heroku 时如何修复 "cannot find -lsqlite3"错误?

postgresql - 尝试使用 Diesel 插入值时出现 "expected struct String, found struct schema::my_table::columns::my_column"

exception - 如何从调用堆栈中的多个层返回?

linux - 我应该在 Rust 中的什么地方保存我的配置文件

rust - serde_json到json在柴油数据库对象中打印附加字符串\r和\n

rust - 编译器目前不知道 Diesel 的属性 `primary_key`

rust - 如何从文件中读取字符串,将其拆分,然后在一条语句中创建Vec <&str>?

indexing - 检查字符串是否旋转时超出范围