Vapor 2,Fluent 模型子类

Posted

技术标签:

【中文标题】Vapor 2,Fluent 模型子类【英文标题】:Vapor 2, Fluent model subclass 【发布时间】:2017-09-26 10:45:40 【问题描述】:

我正在使用 Vapor 2 并尝试创建非最终模型来对其进行子类化。是否可以?我有以下抽象模型代码:

class MongoObject: Model, JSONRepresentable 

    let storage = Storage()

    let creationDate: Date

    init() 
        creationDate = Date()
    

    required init(row: Row) throws 
        creationDate = try row.get(KeyPath.creationDate)
    

    func makeRow() throws -> Row 
        var row = Row()
        try row.set(KeyPath.creationDate, creationDate)
        return row
    

    func makeJSON() throws -> JSON 
        var json = JSON()
        try json.set(KeyPath.id, id)
        try json.set(KeyPath.creationDate, creationDate)
        return json
    



extension MongoObject: Preparation 

    class func prepare(model: Creator)  

    static func prepare(_ database: Database) throws 
        try database.create(self)  (builder) in
            builder.id()
            builder.date(KeyPath.creationDate)
            prepare(model: builder)
        
    

    static func revert(_ database: Database) throws 
        try database.delete(self)
    


但出现编译错误:

非最终类 'MongoObject' 中的方法 'make(for:)' 必须返回 Self 符合协议'Parameterizable'

【问题讨论】:

【参考方案1】:

带有子类的非最终“抽象”模型符合Parameterizable 作为Model 一致性的一部分。参数化需要返回Self。默认情况下,这是通过从路径组件中读取实体的 id 来实现的。您现在遇到的问题是编译器无法为子类返回Self,因为它是在更高的模型上实现的。

解决方案非常简单,您不能在这里进行子类化。

【讨论】:

【参考方案2】:

我可能为时已晚,但我遇到了完全相同的问题,我所要做的就是让课程结束。

非最终类中的方法 'make(for:)' 必须返回 Self 以符合协议 'Parameterizable'

【讨论】:

以上是关于Vapor 2,Fluent 模型子类的主要内容,如果未能解决你的问题,请参考以下文章

在 Vapor 4 中使用 Fluent 进行复杂查询

Vapor fluent 不会在违反外键约束时抛出

在 Vapor 命令中使用 Fluent

如何在 Vapor/Fluent 中正确查询 Postgres JSONB 字段

Vapor Fluent 如何向现有表添加新的必填字段键

如何向 Pivot 添加附加信息(使用 Fluent)?