Изменение значений свойств модели вручную в ответе пара 4
У меня есть приложение Vapor 4. Я делаю запрос из базы данных для получения некоторых элементов и хочу выполнить ручной расчет на основе возвращенных значений до завершения запроса. вот пример кода того, чего я пытаюсь достичь.
final class Todo: Model, Content {
static var schema: String = "todos"
@ID(custom: .id)
var id: Int?
@Field(key: "title")
var title: String
var someValue: Int?
}
/// Allows `Todo` to be used as a dynamic migration.
struct CreateTodo: Migration {
func prepare(on database: Database) -> EventLoopFuture<Void> {
database.schema(Todo.schema)
.field("id", .int, .identifier(auto: true))
.field("title", .string, .required)
.create()
}
func revert(on database: Database) -> EventLoopFuture<Void> {
database.schema(Todo.schema).delete()
}
}
final class TodoController:RouteCollection{
func boot(routes: RoutesBuilder) throws {
routes.get("tmp", use: temp)
}
func temp(_ req:Request) throws -> EventLoopFuture<[Todo]> {
Todo.query(on: req.db).all().map { todos in
todos.map {
$0.someValue = (0...10).randomElement()!
return $0
}
}
}
}
Проблема в том, что эти ручные изменения недоступны в ответ. В этом случаеsomeValue
свойство.
Спасибо.
[
{
"title": "item 1",
"id": 1
},
{
"title": "item 2",
"id": 2
}
]
1 ответ
Проблема, с которой вы столкнулись, в том, что Model
s отменяют Codable
реализации. Это позволяет вам делать такие вещи, как передавать родителей, а не добавлять детей и т. Д.
Однако это ломает ваши доводы. Что вам нужно сделать, так это создать новый тип, если вы хотите вернутьTodo
с другим полем, которое не хранится в базе данных, например:
struct TodoResponse: Content {
let id: Int
let title: String
let someValue: Int
}
А затем конвертируйте из своего типа базы данных в свой тип ответа в обработчике маршрута (это довольно распространенный шаблон и рекомендуемый способ сделать это в Vapor)