Vapor/Fluent:架构中的 uuid 数组时,子对象未保存

Vapor/Fluent: Child object not saving when array of uuids in schema

我有一个 table 包含一个 Coin 实体,以及相应的 Fluent 模型。它拒绝保存,直到我删除了一个字段,该字段旨在包含一组 uuid。这被称为 sources,它的功能是为衍生新硬币的其他硬币提供向后追踪 - 例如,如果用户有两个硬币(可以具有任意数量值),则目标是能够将它们合并成一个单一的硬币,具有合并硬币的组合价值。

架构(注释字段看起来像这样(它包括迁移,相应字段也被注释掉):

final class Coin : Model, Content, ResponseEncodable {
    
    init() {}
    
    init(player: User, quantity: Int, type: CreatedFor, sources : [Coin] = []) {
        self.id = id
        self.$player.id = player.id!
        self.quantity = quantity
        self.type = type
//        self.sources = sources
    }
    
    static let schema: String = "coins"
    
    @ID(key: .id)                   var id: UUID?
    
    @Timestamp(key: "created_at", on: .create) var createdAt: Date?
    @Timestamp(key: "updated_at", on: .update) var updatedAt: Date?
    
    @Parent(key: "player")          var player: User
    
    @Field(key: "quantity")         var quantity: Int
    @Field(key: "type")             var type: CreatedFor
//    @Field(key: "sources")          var sources: [Coin]
    
    enum CreatedFor: String, Codable {
        case transfer
        case ante
        case purchase
        case winnings
        case gift
        case merge
    }
}

extension Coin {
    struct BuildCoin: Fluent.Migration {
        var name : String { "BuildCoin" }
        
        func prepare(on database: Database) -> EventLoopFuture<Void> {
            database.schema("coins")
                .id()
                .field("created_at", .datetime)
                .field("updated_at", .datetime)
                .field("player", .uuid, .required)
                .field("quantity", .int, .required, .custom("DEFAULT 0"))
                .field("type", .string, .required, .custom("DEFAULT 'gift'"))
//                .field("sources", .array(of: .uuid))
                .create()
        }
        
        func revert(on database: Database) -> EventLoopFuture<Void> {
            database.schema("coins").delete()
        }
        
    }
}

一旦我将它归结为出现问题的地方,我就能够得到这个错误,它似乎来自 postgres:

{"error":true,"reason":"server: column \"sources\" is of type uuid[] but expression is of type jsonb[] (transformAssignedExpr)"}

我想包括这个字段(但我现在可以不用它继续)。这里发生了什么?在调用 init() 时,它只是作为一个空数组被调用,所以我认为这不会造成任何问题...

提前致谢...

如果您想保存为 uuid 数组而不是

@Field(key: "sources") var sources: [Coin]

你应该使用

@Field(key: "sources") var sources: [UUID]

其他你试图将硬币数组保存到数据库,并且这个数组将被序列化为 jsonb - 因为它是对象而不是 UUID。查看您的代码,我认为您应该使用一对多或多对多关系。