2012-02-01 2 views
0

Мне нужен класс User, чтобы содержать карту строк, и я видел MongoMapField в api, поэтому я использовал его, потому что это казалось подходящим. Вот мой код:Каков наилучший способ создания изменчивой карты в монго?

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

setToken в этом случае не работает, потому что MongoMapField неизменен (из моего предположения) и следующий код не работает, либо:

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

Кто-нибудь знает, что лучший способ создать/обновить карту строк в монго, которая также прикреплена к пользователю?

Спасибо =)

ответ

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]. Что делать, если я должен использовать MongoMapField [User, OauthInfo], в котором OauthInfo является классом case? Кажется, что он работает корректно, но когда я User.currentUser.open _ !. save, он не сохраняет. Вы знаете, почему это так? – user646658

+0

MongoMapField не поддерживает классы классов. Однако вы можете заставить его работать, переопределяя функции asDBObject и fromDBObject. –

Смежные вопросы