我有用戶的使用配置文件和專家,誰是特殊的用戶非常方便的模式:的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()
}
此代碼將適當的驗證,並將正確的錯誤消息。不過,也有(至少)三個問題:
- 服務做輪廓更新不應該真的要了解不同類型的用戶的任何東西。
- 雖然在配置文件上設置了錯誤,但該配置文件仍然保存到數據庫的 。
- 直到第二次嘗試 用於更新配置文件時,錯誤代碼纔會變成消息。
什麼是驗證繼承的域類屬性的正確方法?或者,是否有更好的模型可以用來完成具有特定角色驗證要求的不同類型用戶的目標?
編輯:原來,只有三個問題的第一個是真實的。另外兩個是由標籤lib在試圖查詢數據庫時保存用戶對象引起的。接受的解決方案(基於用戶標誌在Profile
中進行驗證)解決了這個問題。
或許專家是isExpert用戶==真,而不是一個單獨的課程?那麼國家是可以空的(數據庫設置),除非isExpert == true(域類限制)? – railsdog