Program
与Project
具有一对多的关系。我正在寻找一种在打印 JSON 响应时将所有项目包含在程序中的理想方法。
extern crate rocket_contrib;
#[macro_use]
extern crate serde;
#[macro_use]
extern crate serde_derive;
#[macro_use]
extern crate serde_json;
use rocket_contrib::Json;
use serde_json::Value;
mod schema {
table! {
projects (id) {
id -> Int4,
title -> Varchar,
program_id -> Int4,
is_archived -> Bool,
}
}
table! {
programs (id) {
id -> Int4,
title -> Varchar,
is_archived -> Bool,
}
}
}
fn main() {
let program = Program::get(id);
let json_value = Json(json!({ "result": program }));
}
我研究了实现自定义序列化:
impl Serialize for Program {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
}
}
但是我没有在这个函数中拉取项目所需的db::Conn
。
我正在寻找这样的回复:
{
"id": 1,
"is_archived": false,
"title": "Program 1",
"projects": [{
"id": 2,
"is_archived": false,
"title": "Project 1"
}]
}
最佳答案
实际的答案是不要。值的序列化不应涉及任意数据库调用,它应该仅序列化。创建一个结构来保存所有数据:
#[derive(Serialize)]
struct ProgramAndProjects {
#[serde(flatten)]
program: Program,
projects: Vec<Project>,
}
然后编写一个函数,通过执行所需的数据库查询并直接序列化结果来填充该结构。
这还有一个巨大的好处,那就是更容易测试。
话虽这么说,可能 这样做,但可能不值得。您可以将数据库连接插入 Program
(或使用连接和 Program
创建一个新类型),然后在序列化期间使用该连接.
另见:
关于rust - 使用 Serde 序列化值时如何执行额外的数据库查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53015098/