Vapor 3, предварительно заполнить таблицу данными из другой таблицы - PullRequest
1 голос
/ 09 мая 2019

Я пытаюсь предварительно заполнить таблицы паром 3 и свободным паром.Я новичок в 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)

...