Как использовать MongoListField для возврата списка

Я изучаю лифт и 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. Но я не знаю, как им пользоваться.
Может ли кто-нибудь помочь? Спасибо


person arthur bryant    schedule 23.07.2011    source источник
comment
Я решил это. Использование атрибута value вернет то, что я хочу. список значений: List[ObjectId] = this.likePostList.value   -  person arthur bryant    schedule 24.07.2011
comment
Вы также можете сделать его более безопасным, изменив ObjectId на ваш фактический класс модели. В вашем случае Нравится?   -  person Lukasz    schedule 24.04.2012


Ответы (1)


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

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"

P.S. в старых версиях Lift get назывался is.

person Erik Kaplun    schedule 08.04.2014