Uno-a-uno con ascensore Mapper
Domanda
Come faccio a implementare una relazione uno-a-uno con Mapper? Da Ascensore wiki:
Se stai cercando di modellare una relazione uno-a-uno, basta usare una relazione uno-a-molti. L'unico potenziale fastidio è che avrete una lista [B] invece di una casella [B].
Non c'è un modo più idiomatica?
Soluzione
I potrebbe avvicinarlo, riducendo la visibilità della relazione uno-a-molti e creare un getter / setter in quanto tale:
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
}
ideale? No. Ma più idiomatica che avere codice client accordo con l'elenco [Commento] invece di Opzione [Commento]? Credo di sì.
Su questa stessa linea, si potrebbe anche creare la propria classe che estende MappedOneToMany. Questo codice non è testato, ma credo nello spirito di esso:
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 _ =>
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow