Uno-a-uno relación con ascensor Mapper
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?
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 _ =>
}