Отношения в одну к одному с лифтом Mapper
Вопрос
Как я могу реализовать отношения в одну сторону с Mapper? От лифта Вики:
Если вы хотите смоделировать отношения в одну сторону, просто используйте отношения в одну ко многим. Единственный потенциальный хлопот состоит в том, что у вас будет список [B] вместо коробки [b].
Нет ли более идиоматического способа?
Решение
Я мог бы приблизиться к нему, уменьшая видимость отношений от одной ко многим и создаю добычу / установку как таковой:
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
}
Идеально? Нет. Но более идиоматичнее, чем иметь дело с клиентским кодом со списком [комментарий] вместо опции [комментарий]? Я так думаю.
По этой же линии вы также можете создать свой собственный класс, который расширяет MappyOnetomany. Этот код непросто, но я верю в дух этого:
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 _ =>
}
Не связан с StackOverflow