Индивидуальные отношения с Mapper лифта - PullRequest
0 голосов
/ 04 ноября 2010

Как мне реализовать отношения «один к одному» с Mapper? Из лифта вики:

Если вы хотите смоделировать отношения один-к-одному, просто используйте отношение один-ко-многим. Единственная потенциальная проблема - у вас будет список [B] вместо ящика [B].

Нет ли более идиоматического способа?

1 Ответ

1 голос
/ 06 ноября 2010

Я мог бы подойти к этому, уменьшив видимость отношения один-ко-многим, и создать геттер / сеттер как таковой:

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
}

Идеально? Нет. Но более идиоматично, чем иметь дело с клиентским кодом с List [Comment] вместо Option [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 _ =>
}
...