2011-11-06 7 views
7

私は非常に解決策に近いですが、何かが間違っている、助けを得ることを望みます、事前に感謝します。私は次のようにお客様のドメインモデルを持っているgrails複合 "ユニーク制約"しかし、どのように?

:だから

class BoCustomer implements Serializable{ 

    String firstName 
    String lastName 
    String emailID 
    Company company 
} 

、私は大丈夫だ、主キー=「ID」を持っています。だから私は、同じ電子メールの挿入が許可されるべきであるが、異なる企業のためだけに、「1つの会社のための1つのユニークな電子メールアドレス」を「チェック」する一種のユニークな制約が必要である。挿入([email protected]会社ID:1)および挿入([email protected]会社ID:1)が許可されていないが、([email protected]を挿入,company-id:1)を挿入し、([email protected],company-id:2)を挿入することができます。

は、だから私は、これまでに試した:(「良い」のようですが、私は望んでいない、まさに)

​​

しかし、私は別の列を望んでいない、私の試みで "と呼ばれますemailcompany " - しかし私はユニークな制約のようなものが必要です。

答えて

1

これを制約付きで実行したい場合は、独自のバリデーターを使用できるようにして、BoCustmerが同じemailIDと会社で既に存在する場合に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

あなたの答えはありがたいですが、申し訳ありません。私はあなたのコードを試しましたが、同じ会社のIDを持つ同じ電子メールを2回以上追加することは可能です:-( – grailsInvas0r

+0

.save()を呼び出す前にBoCustomerインスタンスで.validate()を実行しますか?if –

+0

はい.save()を呼び出す前に.validate()を実行します。 それは "true"です。はい、デバッガのブレークポイントとテスト変数でチェックしました。残念ながら、 – grailsInvas0r

関連する問題