Un-à-un avec ascenseur Mapper
Question
Comment puis-je mettre une relation one-to-One avec Mapper? De wiki Lift:
Si vous cherchez à modéliser un-à-un, il suffit d'utiliser un à plusieurs. Les tracas que le potentiel est que vous aurez une liste [B] au lieu d'une boîte [B].
est pas là une façon plus idiomatiques?
La solution
Je pourrais aborder en réduisant la visibilité de celui-à-plusieurs et créer un getter / setter en tant que tel:
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
}
Idéal? Non, mais plus idiomatiques que d'avoir beaucoup de code client avec la liste [Commentaire] au lieu de l'option [Commentaire]? Je pense que oui.
Le long de cette même ligne, vous pouvez créer votre propre classe qui étend MappedOneToMany. Ce code est non testé, mais je crois que dans l'esprit de celui-ci:
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 _ =>
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow