一对属性的Grails条件唯一性约束(类型+值)

时间:2014-01-20 15:55:17

标签: validation grails constraints grails-domain-class

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

  • type id(代表author(1),viewer(3)和其他类型)
  • 构件
  • 制品

-

class Article {
  static hasMany = [ relations: ArticleRelation ]

  string title
}

class ArticleRelation {
  static belongsTo = [ article: Article ]

  int    type
  Member member
}

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

  • 每篇文章只允许一位作者

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

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

类似的东西:

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

1 个答案:

答案 0 :(得分:0)

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

你的实现可能看起来像这样(只是在我的头顶):

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