2012-02-01 9 views
0

文字列のマップを格納するにはUserクラスが必要です.APIでMongoMapFieldが見えたので、適切と思われたので使用しました。ここに私のコードです:mongoで可変マップを作成する最も良い方法は何ですか?

class User private() extends ProtoAuthUser[User] with ObjectIdPk[User] { 
    def meta = User 

    object oauth extends MongoMapField[String, String]("") { 
    def setToken(provider: String, token: String) {this.value += (provider -> token) } 
    def getToken(value: String) = { 
     if(!this.value.isEmpty) Full(this.value.get(value) match { 
     case Some(value) => value 
     case None => "" 
     }) 
     else Empty 
    } 
    } 
} 

MongoMapFieldは(私の仮定から)不変であるので、この場合のsetTokenが機能しないと、次のコードは、いずれかの動作しません:

def setToken(provider: String, token: String) { this.value = this.value + (provider -> token) } 

は誰が何であるかを知っていますユーザーにも添付されているmongoの文字列のマップを作成/更新する最も良い方法は?

感謝=)

答えて

2

不変のデータ構造を扱うときは、新しい値で既存の値を置き換える代わりに、既存の値を変更しようとの観点で考える必要があります。

だから、あなたのコードを動作させるために、あなたはそれを変更する必要があります:

class User private() extends ProtoAuthUser[User] with ObjectIdPk[User] { 
    def meta = User 

    object oauth extends MongoMapField[String, String](this) { 
    def setToken(provider: String, token: String) { 
     this.set(this.value + (provider -> token)) 
    } 
    def getToken(value: String): Box[String] = { 
     Box(this.value.get(value)) 
    } 
    } 
} 
+0

これは完璧に働きました!ありがとうございました! MongoMapField [String、String]をMongoMapField [User、String]に変更するだけでした。 OauthInfoがケースクラスであるMongoMapField [User、OauthInfo]を使用するとどうなりますか?それは正しく動作するようだが、私はUser.currentUser.open _!保存すると、保存されません。なぜこれが当てはまるのか知っていますか? – user646658

+0

MongoMapFieldは、ケースクラスをサポートしていません。ただし、asDBObject関数とfromDBObject関数をオーバーライドすることで、動作させることができます。 –

関連する問題