Pregunta

¿Cómo se implementa una relación uno-a-uno con Mapper? De Ascensor wiki:

  

Si usted está mirando para modelar una relación uno-a-uno, sólo tiene que utilizar una relación de uno a muchos. La molestia sólo potenciales es que usted tiene una lista [B] en lugar de una caja [B].

¿No hay una manera más idiomática?

¿Fue útil?

Solución

Me podría acercarse a ella por la reducción de la visibilidad de la relación de uno a muchos y crear un captador / definidor como tal:

protected object comments extends 
  MappedOneToMany(Comment, Comment.post, OrderBy(Comment.id, Ascending))

def comment : Option[Comment] = {
  comments match {
    case Nil => None
    case head :: _ => Some(head)
  }
}

def comment_=(comment: Comment) = {
  comments.clear
  comments += comment
}

Ideal? No. Pero más idiomática que tener mucho código de cliente con la Lista [Comentario] en lugar de la opción [Comentario]? Creo que sí.

En esta misma línea, se podría también crear su propia clase que se extiende MappedOneToMany. Este código no se ha probado, pero creo en el espíritu de la misma:

class MappedOneToOne[K,T<:KeyedMapper[K, T],O <: Mapper[O]]
  (meta: MetaMapper[O], foreign: MappedForeignKey[K,O,T], qp: QueryParam[O]*) extends MappedOneToMany(meta, foreign, qp) {

  def get : Option[O] = {
    all match {
      case Nil => None
      case head :: _ => Some(head)
    }
  }

  def set(o: O) : O = {
    clear
    this += o
    o
  }
}

class Foo extends KeyedMapper[Int,Foo] {
  object bar extends MappedOneToOne[Int,Foo,Bar]
}

f.bar.get match {
  case Some(bar) => println("Got bar")
  case _ =>
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top