Vapor 3, предварительно заполнить таблицу данными из другой таблицы
Я пытаюсь предварительно заполнить таблицы Vapor 3 и Vapor свободно. Я новичок в Vapor
Я пытаюсь заселить Sharedkeys
с данными из Platform
, Мне удалось запросить Platform
, Однако я изо всех сил пытаюсь заселить SharedKeys
Так что каждый platform
будет иметь shared key
Я включил пример ниже, с этим мне не повезло.
На этой линииlet sharedKeys = platforms.map { platform in
Я получаю ошибку компиляции Unable to infer complex closure return type: add explicit type to disambiguate
Затем я понял, что map
возвращается [T]
, не могу найти способ создать Future<SharedKey>
вместо [SharedKey]
Вот пример моего кодирования, не стесняйтесь критиковать!
Модель платформы
struct Platform : Codable {
var id : Int?
/// Type of platform, i.e. iPhone, iPad, Android etc...
var platform : String
init(platform : String) {
self.platform = platform
}
}
extension Platform : PostgreSQLModel, Content {}
extension Platform : PostgreSQLMigration {
static func prepare(on conn: PostgreSQLConnection) -> Future<Void> {
return Database.create(self, on: conn) { builder in
try addProperties(to: builder)
builder.unique(on: \.platform)
}
}
}
Модель SharedKey
final class SharedKey: Codable {
var id : Int?
/// platform
var platID : Platform.ID?
/// shared key
var key : String
init(key: String, platform : Platform) {
self.key = key
self.platID = platform.id
}
}
extension SharedKey : PostgreSQLModel, Content {}
extension SharedKey : PostgreSQLMigration {
static func prepare(on conn: PostgreSQLConnection) -> Future<Void> {
return Database.create(self, on: conn) { builder in
try addProperties(to: builder)
builder.unique(on: \.key)
}
}
}
Попытка заселить sharedKey
let p = Platform.query(on: conn).all()
let keysFuture = p.flatMap(to: [SharedKey].self) { platforms in
let sharedKeys = platforms.map { platform in
let key = SharedKey(key: "<random key>", platform: platform)
return key.save(on: conn)
}
return sharedKeys
}
То, что я ожидаю, это переменная keysFuture
быть типом Future<[SharedKey]>
НЕ [SharedKey]
Редактировать:
Я использовал этот пример для предварительного заполнения Platform
: https://mihaelamj.github.io/Pre-populating%20a%20Database%20with%20Data%20in%20Vapor/
Заполнение строк в таблицу легко, но пытается заполнить shared key
с platform
это вызов для меня.
Я понял, что мне нужны Sharedkeys, чтобы быть [EventLoopFuture<Void>]
Я обновил следующее:
let pp = Platform.query(on: conn).all()
let op = pp.map { platforms in
return platforms.map { p in
return SharedKey(key: "random", platform: p).create(on: conn).map(to: Void.self) { _ in return }
}
}
Тем не менее, это возвращается как EventLoopFutrue<[EventLoopFutrue<Void>]>
есть ли способ развернуть это?
Мне просто нужно добавить [EventLoopFutrue<Void>]
в futures
по ссылке выше ( https://mihaelamj.github.io/)