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?

Était-ce utile?

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
scroll top