Sky
Sky

Reputation: 2609

Optional nested mapped entity in Slick 2.1.0

I Understand that nested classes work fine with Slick and we have that working in our product. We are facing an issue when the nested class is optional. For instance, look at the following code

   class EmpTable(tag: Tag) extends Table[Emp](tag, "emp") {
     def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
     def name = column[String]("name")
     def aId = column[Option[Int]]("a_id")
     def location = column[Option[String]]("address")
     def address = (aId, location) <> (Address.tupled, Address.unapply)

     def * = (id, name, address.?) <> (Emp.tupled, Emp.unapply)


  }

case class Emp(id: Int, name: String, address: Option[Address])

case class Address(aId: Option[Int], location: Option[String])

This code does not compile because address does not have method ? . Is there an easy way to get this working?

Upvotes: 2

Views: 136

Answers (1)

Sky
Sky

Reputation: 2609

I got a solution for this:

class EmpTable(tag: Tag) extends Table[Emp](tag, "emp") {
  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name")
  def aId = column[Option[Int]]("a_id")
  def location = column[Option[String]]("address")
  def * = (id, name, address, auth) <> (Emp.tupled, Emp.unapply)

  def address = (aId, location).<>[Option[Address], (Option[Int], Option[String])]({ ad:        (Option[Int], Option[String]) =>
  ad match {
    case (Some(id), Some(loc)) => Some(Address(id, loc))
    case _ => None
  }
}, {
  adObj: Option[Address] =>
    adObj match {
      case add: Option[Address] => Some((add.map(_.aId), add.map(_.location)))

    }
})

Upvotes: 2

Related Questions