質問
マッパーと1対1の関係を実装するにはどうすればよいですか?リフトウィキから:
1対1の関係をモデル化したい場合は、1対多様な関係を使用してください。唯一の潜在的な手間は、ボックス[b]の代わりにリスト[b]があることです。
もっと慣用的な方法はありませんか?
解決
1対多数の関係の可視性を減らして、ゲッター/セッターを作成することでアプローチするかもしれません。
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
}
理想?いいえ。しかし、クライアントコードをオプション[コメント]の代わりにリストと扱うよりも慣用的ですか?そう思います。
この同じ行に沿って、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 _ =>
}
所属していません StackOverflow