2016-11-09 81 views
0

我有用戶的使用配置文件和專家,誰是特殊的用戶非常方便的模式:的Grails - 繼承域類的屬性驗證

class User { static hasOne = [profile: Profile] } 

class Profile { 
    String country 
    static constraints = { country nullable: true, blank: true } 
} 

class Expert extends User { 
    static constraints = { 
     profile validator: { val, obj -> 
      if (!val.country) { 
       val.errors.rejectValue 'country', 'expert.profile.country.nullable' 
      } 
     } 
    } 
} 

當我創建的專家,設置其配置文件屬性,然後保存專家,這是應該的。但是,如果用戶想保存他們的配置文件,我堅持如何正確驗證配置文件屬性取決於他們是否是專家。

這是我到目前爲止有:

Expert expert = Expert.get(profile.user.id) 
    if (expert) { 
     expert.properties = params 
     expert.save() 
    } else { 
     profile.user.properties = params 
     profile.user.save() 
    } 

此代碼將適當的驗證,並將正確的錯誤消息。不過,也有(至少)三個問題:

  1. 服務做輪廓更新不應該真的要了解不同類型的用戶的任何東西。
  2. 雖然在配置文件上設置了錯誤,但該配置文件仍然保存到數據庫的 。
  3. 直到第二次嘗試 用於更新配置文件時,錯誤代碼纔會變成消息。

什麼是驗證繼承的域類屬性的正確方法?或者,是否有更好的模型可以用來完成具有特定角色驗證要求的不同類型用戶的目標?

編輯:原來,只有三個問題的第一個是真實的。另外兩個是由標籤lib在試圖查詢數據庫時保存用戶對象引起的。接受的解決方案(基於用戶標誌在Profile中進行驗證)解決了這個問題。

+1

或許專家是isExpert用戶==真,而不是一個單獨的課程?那麼國家是可以空的(數據庫設置),除非isExpert == true(域類限制)? – railsdog

回答

2

我認爲你必須設置該配置文件屬於一個用戶,並且可以爲空。之後,您可以在配置文件類中創建驗證器。也許對於你的專家類型需要一個新的類,但我不知道這是否是強制性的。

也許我可以實現用戶類中的方法,要知道如果一個實體是根據其性質方面的專家,或物業本身

class User { 
    static hasOne = [profile: Profile] 
    boolean expert 
} 

class Profile { 
    static belongsTo = [user: User] 
    String country 
    static constraints = { 
     country validator: { val, obj -> 
      if (obj.user?.expert && !val.country) { 
       val.errors.rejectValue 'country', 'expert.profile.country.nullable' 
      } 
     } 
     user nullable: true 
    } 
} 
+0

謝謝!這使我走上了正確的道路! – helgew

+0

不客氣! ;) – quindimildev