2011-11-06 61 views
7

我非常接近解决方案,但任何事情仍然是错误的,希望得到帮助,提前致谢。grails复合材料“独特的约束”,但如何?

我有一个客户域模型,如:

class BoCustomer implements Serializable{ 

    String firstName 
    String lastName 
    String emailID 
    Company company 
} 

所以,我有一个主键=“ID”没关系。因此,我需要进一步“检查”下面的一个唯一约束:“一家公司只有一个唯一的电子邮件地址”,因此应该允许插入相同的电子邮件,但仅限于不同的公司。插入([email protected]公司-ID:1)和插入([email protected]公司-ID:1)是不允许的,但插入([email protected],company-id:1)并插入([email protected],company-id:2)是允许的。

所以,我想到目前为止:

​​

(似乎是“好”,但不正是我想要的)

,但我不希望再列,在我尝试叫“ emailcompany“ - 但我需要一些独特的约束。

回答

1

如果您想强制执行此操作,您应该可以使用自定义验证程序,以便在BoCustmer已存在且具有相同的电子邮件ID和公司的情况下返回false。它已经有一段时间,因为我用它,但我觉得这样的事情应该工作:unique

class BoCustomer implements Serializable{ 

    String firstName 
    String lastName 
    String emailID 
    Company company 

    static constraints = { 
     emailID(unique: 'company') 
      // OR 
     company(unique: 'emailID') 
    } 
} 

您可以:

class BoCustomer implements Serializable{ 
    String firstName 
    String lastName 
    String emailID 
    Company company 

    static constraints = { 
     emailID( 
      validator: { val, obj -> 
       def customerWithSameEmailAndCompany = BoCustomer.findByEmailIDAndCompany(obj.emailID, obj.company) 
       return !customerWithSameEmailAndCompany 
      } 
     ) 
    } 
} 
+0

嘿Kaleb,感谢您的回答,但我很抱歉。我尝试了你的代码,但仍然有可能使用相同的公司id两次(以及更多)添加相同的电子邮件:-( – grailsInvas0r

+0

你是否在调用.save()之前在BoCustomer实例上运行.validate()?if所以,验证返回true? –

+0

是的,我调用.save()之前运行一个.validate()。 它返回“真”是的,我用调试断点和测试变量检查它 - 它不幸返回true: – grailsInvas0r