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/)

0 ответов

Другие вопросы по тегам