我尝试根据外部参数为order_by
指定不同的列。
这是可行的,但很难看:
#[macro_use]
extern crate diesel;
use crate::diesel::prelude::*;
use diesel::pg::PgConnection;
mod schema {
table! {
items (id) {
id -> Int4,
name -> Text,
}
}
}
#[derive(Queryable, Debug)]
pub struct Item {
pub id: i32,
pub name: String,
}
fn load_items(conn: PgConnection, sort_prop: String, sort_dir: String) -> Vec<Item> {
use schema::items::dsl::*;
let mut query = items.into_boxed();
// ugly: duplicating condition by sort_dir and query.order_by() calls
query = match sort_prop.as_str() {
"name" => {
if sort_dir == "asc" {
query.order_by(name.asc())
} else {
query.order_by(name.desc())
}
}
_ => {
if sort_dir == "asc" {
query.order_by(id.asc())
} else {
query.order_by(id.desc())
}
}
};
query.load::<Item>(&conn).expect("Failed to load items")
}
fn main() {}
我的货物。汤姆有这个:
[dependencies]
diesel = { version = "1.4.3", features = ["postgres"] }
我只想按列而不是整个查询进行条件化,如下所示:
use schema::items::dsl::*;
let mut column = match sort_prop.as_str() {
"name" => name,
_ => id // error: match arms have incompatible types
}
column = if sort_dir == "asc" {
column.asc()
} else {
column.desc()
}
let results = items
.order_by(column)
.load::<Item>(connection)
.expect("Failed to load items");
这是可能的吗?有没有其他方法来重构它?
我读过Querying a Diesel table with dynamic parameters,但它基本上是关于整个查询的条件化,这是我试图避免的。
我也读过Creating Diesel.rs queries with a dynamic number of .and()'s,它是关于通过过滤器进行条件化的,这可能接近我对order_by
的需要,但我很难将BoxableExpression
的怪异之处应用到我的案例中,因为文档中缺乏我的确切案例的好例子,也缺乏RLS支持来显示IDE中的任何schema::items::dsl::*
类型,所以我可以自己摸索。
2条答案
按热度按时间6yjfywim1#
给定以下模式:
和以下包含排序选项的结构:
可以执行以下操作:
其中,如果使用以下函数,则使用sort_by_column
63lcw9qa2#
我遇到了同样的问题。希望这对任何表/查询都有效:
以下是我的解决方案(适用于柴油机1和2)