Scala 与电梯映射器的一对一关系

Scala 与电梯映射器的一对一关系,scala,lift,mapper,Scala,Lift,Mapper,如何实现与Mapper的一对一关系? 从Lift wiki: 如果您希望建立一对一关系的模型,只需使用一对多关系即可。唯一可能的麻烦是您将有一个列表[B],而不是一个框[B] 难道没有更惯用的方法吗?我可以通过降低一对多关系的可见性来实现它,并创建一个getter/setter: protected object comments extends MappedOneToMany(Comment, Comment.post, OrderBy(Comment.id, Ascending))

如何实现与Mapper的一对一关系? 从Lift wiki:

如果您希望建立一对一关系的模型,只需使用一对多关系即可。唯一可能的麻烦是您将有一个列表[B],而不是一个框[B]


难道没有更惯用的方法吗?

我可以通过降低一对多关系的可见性来实现它,并创建一个getter/setter:

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
}
理想?不是。但是比让客户端代码处理列表[Comment]而不是选项[Comment]更惯用?我想是的

沿着这条路线,您还可以创建自己的类,该类扩展了MappedOneToMany。此代码未经测试,但我相信其精神:

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 _ =>
}
class Mappedoone[K,T部分(头部)
}
}
def设置(o:o):o={
清楚的
这个+=o
o
}
}
类Foo扩展KeyedMapper[Int,Foo]{
对象栏扩展MappedOneNote[Int,Foo,bar]
}
f、 酒吧,比赛{
case Some(bar)=>println(“Got bar”)
案例=>
}