2011-07-23 5 views
3

私はリフトとモンゴブを学んでいます。次のような問題が発生しました。簡単にするためにいくつかのコードをバイパスします。コードは次のとおりです。MongoListFieldを使ってリストを返す方法

object User extends User with MetaMegaProtoUser[User] { 

} 

class User extends MegaProtoUser[User] { 
    def meta = User 

    //record the post list that user like 
    object likePostList extends MongoListField[User, ObjectId](this) 

    def test() 
    { 
    val list: = this.likePostList 
    println(list.length) 
    } 
} 

error: value length is not a member of object User.this.likePostList 
this.likePostList.length 

私はObjectIdデータをMongoDBに格納できます。しかし、MongoListFieldはリストを返しません。どうして?それをリストとして使用する方法。

[OjbectId]やList [String]のリストに型ケースを追加しようとしましたが、運がありません。

val list: List[ObjectId] = this.likePostList.asInstanceOf[List[Object]] 

ガットエラー: とjava.lang.ClassCastException:com.cosiin.model.User $ likePostList $は私がMongoListFieldに間違ったを使用しています考えてscala.collection.immutable.List

にキャストすることはできません方法。しかし、私はそれを使う方法を知らない。
誰でもお手伝いできますか?ありがとう

+1

私はそれを解決しました。 value属性を使用すると、私が望むものが返されます。 val list:List [ObjectId] = this.likePostList.value –

+0

ObjectIdを実際のモデルクラスに変更することで、より安全に型を変更することもできます。あなたの場合のように? – Lukasz

答えて

0

Lift Recordsで宣言したフィールドはフィールドオブジェクトであり、フィールドに含まれる実際の値ではありません。

this.likePostList.get 

またはフィールドは、オブジェクトのようscala.Optionを返し

this.likePostList.valueBox 

オプションの場合:あなたが呼び出す必要があり、実際の値にアクセスするために。

あなたはそれを考える場合、あなたが実際にあなたが入力したときMongoListFieldのインスタンスであることをlikePostListを宣言しているので、これは非常に理にかなって:

object likePostList extends MongoListField[User, ObjectId](this) 

val likePostList: List[ObjectId] = ... 

とは反対にありますScalaが自動的にそれをList[ObjectId]に変換することはできません。

class Foo { 
    val bar = 3 
    object baz { val greeting = "hello" } 
} 

val foo = new Foo 
println(foo.bar) // prints 3 
println(foo.baz) // prints something like [email protected] 
println(foo.baz.greeting) // prints "hello" 

P.S.:それは同じですLiftの古いバージョンではgetisと呼ばれました。

関連する問題