我有一个模型活动,有多个月份:
final class Campaign: Content, SQLiteModel {
var id: Int?
var name: String
var months: Children<Campaign, Month> {
return children(\.campaignID)
}
}
当我想以最基本的方式返回一个活动时,它不包括月份,因为据我所知,计算属性不是可编码的。
func getOneHandler(_ req: Request) throws -> Future<Campaign> {
return try req.parameters.next(Campaign.self)
}
所以,我创建了一个新结构来保存我想要返回的完整对象
struct FullCampaignData: Content {
let id: Int
let name: String
var months: [Month]?
}
然后像这样修改我的路由处理程序:
func getOneHandler(_ req: Request) throws -> Future<FullCampaignData> {
return try req.parameters.next(Campaign.self).flatMap(to: FullCampaignData.self) { campaign in
return try campaign.months.query(on: req).all().map(to: FullCampaignData.self) { months in
return try FullCampaignData(id: campaign.requireID(), name: campaign.name, months: months)
}
}
}
这确实有效。但是,这样做似乎需要做很多工作和大量样板文件。处理子对象或其他一般计算对象的正常 Swifty“Vapory”方式是什么?现在它似乎归结为你的模型的一堆不同版本(用于创建,用于返回,实际的完整内部模型),然后在它们之间进行转换,但我希望我在这里缺少一些东西?因为很容易忘记将新添加的模型属性也添加到该特殊的公共模型中。
或者至少,如果确实以推荐的方式在模型之间进行转换,是否有一种方法不需要路由处理程序中的所有这些嵌套地图/平面地图?