2

I have this domain object:

case class Person (
  name : String,
  age: Option[Int],
  email : String
) extends MongoObject

with the age optional field. So I defined my factory:

object Person extends MongoObjectShape[Person] {
  lazy val name = Field.scalar("name", _.name)
  lazy val age = Field.optional("age", t => t.age)
  lazy val email = Field.scalar("email", _.email)

  override lazy val * = name :: age :: email :: Nil
  override def factory(dbo: DBObject): Option[Person] = 
    for {
      n <- name from dbo
      t <- age from dbo
      z <- email from dbo
    } yield new Person(n, t, z)
}

but it does not compile, since I get:

[error]  found   : Int
[error]  required: Option[Int]
[error]     } yield new Person(n, t, z)
[error]                           ^

What is wrong with this?

onof
  • 17,167
  • 7
  • 49
  • 85

3 Answers3

4

maybe, you could write

override def factory(dbo: DBObject): Option[Person] = 
    for {
      n <- name from dbo
      z <- email from dbo
    } yield new Person(n, age from dbo, z)
onof
  • 17,167
  • 7
  • 49
  • 85
  • thank you, it works. Definitely I have to learn more about pattern matching in Scala. – onof Dec 17 '10 at 18:32
3

A variant of amsayk's answer, but slightly more symmetrical

for {
      n <- name from dbo
      t = age from dbo
      z <- email from dbo
    } yield new Person(n, t, z)
Dave Griffith
  • 20,435
  • 3
  • 55
  • 76
1

You need to wrap t in a Some object

} yield new Person(n, Some(t), z)
Monkey
  • 11
  • 1