2012-05-31 1 views
1

나는 NameAndAddress라는 도메인 클래스를 가지고있다. 각각은 음악가 또는 커뮤니티 회원이 될 수 있지만 둘 다일 수는 없습니다.Grails : 필드 확인중인 항목이 이미 다른 도메인 클래스에 추가되었는지 어떻게 확인합니까?

class NameAndAddress { 
    ... 
} 

class Musician { 
    NameAndAddress nameAndAddress 
} 

class CommunityMember { 
    NameAndAddress nameAndAddress 
} 

위의 규칙을 확인하면서 양쪽에 유효성 검사기를 추가하고 싶습니다. 나는 음악가로 시작 :

class Musician { 
    NameAndAddress nameAndAddress 

    static constraints = { 
     nameAndAddress(validator: { thisField -> 
      return (CommunityMember.findByNameAndAddress(thisField) == null) ? true : false 
     }) 
    } 
} 

내가 얻을하지만 나는 뮤지션에 대한 유효성 검사를() 실행하면 :

groovy.lang.MissingMethodException: No signature of method: CommunityMember.findByNameAndAddress() is applicable for argument types: (NameAndAddress) values: [NameAndAddress : 1] 
Possible solutions: findByNameAndAddress([Ljava.lang.Object;) 

내가 오류를 이해하지 않습니다. NameAndAddress 객체가 기대하는 것 ... NameAndAddress 객체에 부여하는 것이 유효하지 않다고 말하는 것이 아닙니까?

이 기능을 사용하려면 어떻게해야합니까?


편집 :
(해결 방법) - 아직 방법보다 사용하여 작동하지 않습니다. @sudhir이 지적한 추악한 해결 방법을 통해 성능이 저하되었습니다.

nameAndAddress(validator: { thisField, thisObject -> 
    boolean notACommunityMember = true 

    for (CommunityMember communityMember : CommunityMember.list()) { 
     if (communityMember.getNameAndAddress().getId() == thisField.getId()) { 
      notACommunityMember = false 
      break 
     } 
    } 

    return notACommunityMember 
}) 

Edit2가 : 그 사람이 내가 깨끗한 방법으로 할 노력하고있어 이해하는 데 도움이 경우이 코드는,하지만 작동 않습니다
(단위 테스트 코드에 의해 요청, 확인 전화 의견) -

@TestMixin(DomainClassUnitTestMixin) 
class MusicianTest ... 

    NameAndAddress aNameAndAddress = new NameAndAddress() 

    mockDomain(CommunityMember, [ 
     [nameAndAddress: aNameAndAddress] 
    ]) 

    Musician musician = new Musician(nameAndAddress: aNameAndAddress) 

    musician.validate() 
    assert musician.errors["nameAndAddress"] != null 
+0

(성능 적중률이 될 것입니다) CommunityMember 목록을 반복합니다. - (CommunityMember.findByPerson (this)) {notACommunityMember} –

+0

감사합니다. 그것은 수표를 찍는 훨씬 더 좋은 방법입니다. 나는 지난 밤에 너무 늦었 어. 그리고 그것은 지금 명백한 의미가있다. – Bukov

+0

나는 여전히 오류가 발생하고 있지만, 나는 그것이 내 시험 수업에서 잘못 조롱 한 것과 관련이 있다는 것을 확신한다. – Bukov

답변

0

댓글에 Sudhir이 답변했습니다. 도메인 클래스 이름에 "And"(또는 어떤 전제도)가 있으면 Grails의 기이 한 작은 findByThenPutVariablesInTheMethodName 구문이 엉망이됩니다.

이름이 class가 NameAddress로 이름이 바뀌 었습니다.

누구나 할 수있는 일이지만, DomainClass.findByWhatever가 포함 된 단위 테스트를 수행 할 때는 Grails의 mockDomain 클래스를 사용해야합니다. 내 예제를 질문 하단에 넣습니다.

관련 문제