【问题标题】:grails - validation of inherited domain class attributesgrails - 继承域类属性的验证
【发布时间】: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()
    }

此代码进行正确的验证并设置正确的错误消息。但是,有(至少)三个问题:

  1. 进行配置文件更新的服务不应该真正了解不同类型用户的任何信息。
  2. 在配置文件中设置错误时,配置文件仍被保存 到数据库。
  3. 在第二次尝试之前,错误代码不会变成消息 用于更新个人资料。

验证继承的域类属性的正确方法是什么?或者,是否有更好的模型可用于实现具有特定角色验证要求的不同类型用户的目标?

编辑:事实证明,这三个问题中只有第一个是真实的。其他两个是由在尝试查询数据库时保存用户对象的标记库引起的。接受的解决方案(基于用户标志在Profile 中验证)解决了这个问题。

【问题讨论】:

  • 也许专家是具有 isExpert == true 的用户而不是单独的类?那么国家可以为空(数据库设置),除非 isExpert == true(域类限制)?

标签: validation grails grails-orm


【解决方案1】:

我认为您必须设置配置文件属于用户,并且可以为空。之后,您可以在配置文件类中创建验证器。也许对你来说,专家类型需要一个新课程,但我不确定这是否是强制性的。

也许我可以在 User 类中实现一个方法,以根据实体的属性或属性本身来判断实体是专家

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多