如何在表格映射中引用类本身

时间:2017-01-07 06:07:21

标签: scala playframework

我有以下case类,我想为它创建一个表单映射函数。该类使用自己类型的对象。如何为这种情况编写映射函数?

case class User (
  name:String,
  age:Int,
  female:Boolean,
  address:Address, //this is another case class of 3 Strings
  friends:List[User], //an object of its own type
  spouse:Option[User]
)

到目前为止我写过这篇文章,但不知道如何处理朋友和配偶

val userForm = Form((mapping("name"->text,
    "age"->number,
    "female"->boolean,
    "address"->mapping("fullStreet"->text,
                        "county"->text,
                        "country"->text)(Address.apply)(Address.unapply),
    "friends"->list(???),
    "spouse"->optional(???)
    )(User.apply)(User.unapply))

1 个答案:

答案 0 :(得分:0)

通常,类型可以帮助您在脚下拍摄自己。当你在这种情况下结束时,重新考虑你正在做的事情有时是明智的。

在这种特殊情况下,你实际上不太可能想要一个无限递归的结构,你也想要朋友的朋友的朋友等等,这可能是你的整个数据库。配偶也会产生问题,因为某些人配偶的配偶是同一个人,所以你的数据结构永远不会结束。这同样适用于朋友。当然我可以认为你是朋友而你实际上并不认为我是朋友,但这些情况是规则的例外:)

您可能想要做的是以下两种情况之一:

  1. 创建一个只包含基本属性的用户特征和案例类,这样就没有朋友和配偶,并使用该特征作为User案例类的基础,并将该案例类作为{{的基础类型1}}和friends
  2. 分配用户ID并以这种方式引用用户。 spouse然后变为FriendsSet[UserId]一个spouse