2017-09-26 10 views
2

私はVapor 2を使用しており、非最終モデルを作成してサブクラス化しようとしています。出来ますか?Vapor 2、Fluent modelサブクラス

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

} 

が、コンパイル・エラーを得た:サブクラスと

method 'make(for:)' in non-final class 'MongoObject' must return Self to conform to protocol 'Parameterizable'

答えて

1

あなたの非最後の「抽象的」モデルは、Model準拠の一環としてParameterizableに準拠している私は、抽象モデルのコードを次のようしています。パラメータ設定可能な場合は、Selfを返す必要があります。デフォルトでは、これはパスコンポーネントからエンティティのIDを読み取ることで実装されます。問題は、上位モデルで実装されているので、コンパイラはサブクラスに対してSelfを返すことができないということです。

解決方法はかなり簡単です。ここでサブクラス化することはできません。

0

私は遅すぎるかもしれませんが、私はまったく同じ問題を抱えていました。私がしなければならなかったのは、クラスを最終的にすることでした。

method 'make(for:)' in non-final class 'MongoObject' must return Self to conform to protocol 'Parameterizable'

関連する問題