2011-11-06 54 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