【问题标题】:Grails conditional uniqueness constraint for a pair of attributes (type + value)一对属性(类型+值)的Grails条件唯一性约束
【发布时间】:2014-01-20 15:55:16
【问题描述】:

在 Grails 2.3.4 应用程序中,我有一个表示作者和文章之间关系的域类。它包含三个属性:

  • 类型id(代表作者(1)、查看者(3)等类型)
  • 会员
  • 文章

-

class Article {
  static hasMany = [ relations: ArticleRelation ]

  string title
}

class ArticleRelation {
  static belongsTo = [ article: Article ]

  int    type
  Member member
}

某些类型在语义上不允许创建超过一对类型+作者。例如:

  • 每篇文章只能有一个作者

其他类型+作者没有这个限制。例如:查看器。

我在域类中寻找一种验证方法,该方法可以根据类型的值保证类型+作者对的唯一性。

类似:

static constraints = {
    member unique: if (type == 1 || type == 2)
}

是否可以在 Grails 域类中编写这样的约束?

--编辑--

事实上,我发现条件需要不同的写法:类型+文章需要是唯一的对才能正确描述包含。

所以 ArticleRelation 中的约束是

static constraints = {
  article validator: { val, obj ->
    if ((obj.type == 1) || (obj.type == 2)) {
      if (ArticleRelation.countByArticleAndType(val, obj.type) > 0) return ['myNotUniqueErrorKey']
    }
  }
}

【问题讨论】:

    标签: validation grails constraints grails-domain-class


    【解决方案1】:

    您需要为此编写自己的自定义验证器实现。幸运的是,Grails 公开了一种方法。用于验证的documentation 显示了一些基本实现,最后一个最适用于您的情况,因为您需要引用实例的其他属性。

    您的实现可能看起来像这样(只是在我的脑海中):

    static constraints = {
      member validator: { val, obj ->
        if ((obj.type == 1) || (obj.type == 2)) {
          if (ArticleRelation.countByMemberAndType(val, obj.type) > 0) return ['myNotUniqueErrorKey']
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 2012-05-08
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      相关资源
      最近更新 更多