2011-11-06 2 views
7

나는 해결책에 매우 가깝지만 아무 것도 여전히 잘못되어 도움을 얻을 수 있기를 바랍니다. 미리 감사드립니다.grails composite "유일한 제약", 어떻게?

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)를 삽입 할 수 있습니다.

그래서 내가 지금까지 시도 : ("좋은"것 같다,하지만 내가 원하는 정확히 무엇을)

static mapping = { 
    id column: "customer_id", generator: "identity" 
    emailcompany composite: ['emailID', 'company'], unique: true 
} 

하지만 다른 열을 원하지 않는, 내 시도에 "라는 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 –

+0

예 .save()를 호출하기 전에 .validate()를 실행합니다. 그리고 "true"를 반환합니다. 예, 디버거 중단 점과 테스트 변수로 검사했습니다. - 불행히도 true를 반환합니다. - \ – grailsInvas0r