2010-11-04 4 views
0

Comment implémenter une relation un-à-un avec Mapper? De wiki Lift:Relation 1-one avec lift Mapper

Si vous cherchez à modéliser un-à-un, il suffit d'utiliser un à plusieurs. Le seul problème potentiel est que vous aurez une liste [B] au lieu d'une boîte [B].

N'y at-il pas une manière plus idiomatique?

Répondre

1

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 idiomatique que d'avoir du code client avec la liste [Commentaire] au lieu de l'option [Commentaire]? Je le pense.

Sur cette même ligne, vous pouvez également créer votre propre classe qui étend MappedOneToMany. Ce code n'a pas été testé, mais je crois 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 _ => 
} 
Questions connexes