2014-01-20 41 views
0

在Grails 2.3.4应用程序中,我有一个表示作者和文章之间关系的域类。它包含三个属性:一对属性的Grails条件唯一性约束(类型+值)

  • 类型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'] 
    } 
    } 
} 

回答

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