2017-01-07 59 views
1

類本身我有以下案例類,我想爲它創建一個表單映射功能。該類使用它自己類型的對象。我如何編寫這種場景的映射函數?如何推薦表格映射

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)) 

回答

0

很多時候,類型幫助你的腳搬起石頭砸自己。當你在這種情況下結束時,重新考慮你正在做什麼有時是明智的。

在這種特定情況下它是極不可能的,你需要的是一個無限遞歸結構,你也想的朋友等的朋友,這很可能是你的整個數據庫的朋友。配偶也會產生問題,因爲配偶的配偶是同一個人,所以你的數據結構永遠不會結束。這同樣適用於朋友。當然,我可以考慮你的朋友,你實際上可以不考慮我作爲一個朋友,但這些情況是例外:)

你可能想要做的是以下兩種情況之一:

  1. 僅使用基本屬性創建用戶特徵和案例類,因此沒有朋友和配偶,並將該特徵用作User案例類的基礎,並將該案例類用作friendsspouse的基礎類型。
  2. 指定用戶ID和指在時尚的用戶。 Friends然後就變成了Set[UserId]spouse一個Option[UserId]
+0

欣賞你的設計投入。我對Scala和Play都很陌生,這是我從Play/Java一書中挑選的練習。我無法在Scala/Play中做同樣的事情。你能告訴我在Scala/Play的編碼方面如何解決這個問題嗎? –

+0

完全取決於設計。我肯定不會沿着你擁有一個擁有用戶的用戶的用戶所走過的道路,無限廣告。這就是問題所在,因此這就是答案所在。選擇一個有效的設計,就像我給出的兩個建議,我相信你將能夠繼續編碼。如果你接受我的回答 –

+0

@ManuChadha將是很好 –