Как использовать MongoListField для возврата списка - PullRequest
3 голосов
/ 23 июля 2011

Я учусь лифту и mongodb.Я столкнулся с проблемой следующим образом.Я буду обходить некоторый код для простоты.Вот код:

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 не возвращает список.Зачем?Как использовать это как список.

Я пытаюсь добавить регистр типов в List [OjbectId] или List [String], но безуспешно.

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

Ошибка: java.lang.ClassCastException: com.cosiin.model.User $ likePostList $ не может быть приведен к scala.collection.immutable.List

Я думаю, что используюMongoListField в неправильном направлении.Но я не знаю, как его использовать.
Может кто-нибудь помочь?Спасибо

1 Ответ

0 голосов
/ 08 апреля 2014

Поля, которые вы объявляете в записях лифта, являются объектами поля, а не фактическими значениями, содержащимися в поле.Чтобы получить доступ к фактическому значению, вам нужно вызвать:

this.likePostList.get

или если поле является необязательным

this.likePostList.valueBox

, которое возвращает scala.Option подобный объект.

Если вы думаете об этом, это имеет большой смысл, потому что вы на самом деле объявляете likePostList экземпляром MongoListField при вводе:

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 Foo$baz$@1d981b6a
println(foo.baz.greeting) // prints "hello"

PS в более старых версиях Lift, get назывался is.

...