【发布时间】:2016-11-09 23:05:55
【问题描述】:
我有一个相当简单的用户模型,其中包含个人资料和专家,他们是特殊用户:
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()
}
此代码进行正确的验证并设置正确的错误消息。但是,有(至少)三个问题:
- 进行配置文件更新的服务不应该真正了解不同类型用户的任何信息。
- 在配置文件中设置错误时,配置文件仍被保存 到数据库。
- 在第二次尝试之前,错误代码不会变成消息 用于更新个人资料。
验证继承的域类属性的正确方法是什么?或者,是否有更好的模型可用于实现具有特定角色验证要求的不同类型用户的目标?
编辑:事实证明,这三个问题中只有第一个是真实的。其他两个是由在尝试查询数据库时保存用户对象的标记库引起的。接受的解决方案(基于用户标志在Profile 中验证)解决了这个问题。
【问题讨论】:
-
也许专家是具有 isExpert == true 的用户而不是单独的类?那么国家可以为空(数据库设置),除非 isExpert == true(域类限制)?
标签: validation grails grails-orm