Eins-zu-Eins-Beziehung mit Aufzug Mapper
Frage
Wie implementiere ich eine Eins-zu-Eins-Beziehung mit Mapper? Vom Aufzug wiki:
Wenn Sie suchen eine Eins-zu-Eins-Beziehung zu modellieren, verwenden Sie nur eine Eins-zu-viele-Beziehung. Der einzige potenzielle Ärger ist, dass Sie eine Liste haben werden [B] anstelle einer Box [B].
Gibt es nicht einen mehr idiomatischen Weg?
Lösung
Ich könnte es nähern, indem die Sichtbarkeit der Eins-zu-viele-Beziehung zu reduzieren und schaffen eine Getter / Setter als solche:
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? Nein, aber mehr idiomatische als Client-Code Deal mit der Liste [Kommentare] statt Option [Kommentar]? Ich denke schon.
Auf dieser gleichen Linie, können Sie auch Ihre eigene Klasse erstellen, die MappedOneToMany erstreckt. Dieser Code ist nicht getestet, aber ich glaube, im Geist es:
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 _ =>
}