0

Strings의 목록을 보유한 도메인 클래스가 필요했습니다. GORM이이 문제를 처리 할 수 ​​없다는 것이 꽤 잘 알려진 것 같아서 해결했습니다. 처음에는 getters와 setters를 사용하여 도메인 클래스에서 시도했지만 문제가 발생했습니다. 그런 다음 Stack Overflow에서 afterLoad()beforeValidate()을 사용하여 아래 표시된대로 속성을 다시 작성하는 방법을 발견했습니다. 이는 내게 List을 지속성을 위해 String으로, 그리고 앱에서 사용하기 위해 List으로 되돌리기 위해 효과적이었습니다.도메인 개체를 저장하기 전에 매개 변수 수정

class Entries { 
     // persisted to database 
     String _entry 

     // exposed to app 
     List entry 

     static transients = ['entry'] //don't try to persist the List 

     def afterLoad() { 
          // split the String from the database into a List 
      entry = _entry?.split('\\|') 
     } 

     def beforeValidate() { 
          // join the List into a String for persisting 
      _entry = entry.join('|') 
     } 

     static constraints = { 
      _entry maxSize:4000 
     } 
    } 

프로그래밍 방식으로 올바르게 작동합니다. 유일한 문제는 파이프로 구분 된 문자열을 입력하려고해도 Grails 스캐 폴딩이 처리 할 수 ​​없다는 것입니다. 그 이유는 왜 비계가 _entry 양식 필드를 생성하는지 알기 때문에 entry은 객체를 저장하려고 할 때 null입니다. beforeValidate()은 작업 할 문자열 목록을 사용합니다.

으로 전화하기 전에 params.entry = params._entry으로 설정하여 컨트롤러에서이 문제를 해결하려고했습니다. [이것이 완벽한 해결책은 아니라는 것을 알았지 만 이것이 양식을 얻는 첫 번째 단계였습니다.] beforeValidate()에 시험을 추가하여 entry = _entry을 입력하면 entrynull입니다. 기본적으로 :

EntriesController.groovy :

params.entry = params._entry // I added this line 
def entriesInstance = new Entries(params) 

Entries.groovy :

def beforeValidate() { 
     if(entry == null) entry = _entry // I added this line 
     _entry = entry.join('|') 
    } 

나는 나를 스캐 폴딩에 파이프로 구분 된 문자열을 입력 할 수 있도록 항목 양식을 작성하고 뭔가를 얻을 것이라고 생각을 데이터베이스에 저장합니다.

는 놀랍게도하지만, 나는 인쇄 params 컨트롤러에서 두 키를 포함 것을 확인에도 불구하고, 모두 entry_entrybeforeValidate()null을 것을 발견했다. 나는 이것이 왜 일어나는 지 이해하지 못한다. params에 새 키를 추가하면 null이 도메인 클래스에 도착하게됩니까?

물론 후속 질문은 비계 작성 항목 양식을 파이프로 구분 된 문자열을 받아 데이터베이스에 넣는 올바른 방법일까요?

답변

2

문자열 목록을 보유한 도메인 클래스가 필요했습니다. GORM이이 문제를 처리 할 수 ​​없다는 것이 꽤 잘 알려진 것 같아서 해결했습니다.

나는 (그것은 실제로 설정됩니다) 문자열의 목록을 유지하기 위해 별도의 테이블을 생성해야 여기

class Xyz { 

static hasMany = [entries: String] 

} 

당신과 함께 동의하지 않습니다. 여기에 있습니다 docs

+0

글쎄, 잘 알고 있습니다. 외관상으로는, 나는 날짜가 기입 된 정보를보고 있었다. 하지만 스캐 폴딩이 이것을 처리 할 수 ​​없다는 것을 알 수 있습니다. 해결 방법이 있습니까? 이 사실을 알려 주셔서 감사 드리며 답변을 드리겠습니다. 하지만 params 배열에 어떤 일이 일어나고 있는지 이해할 수 없기 때문에 여전히 내 질문에 대한 대답을 원합니다. –

+0

나는 둘 중 하나를 이해하지 못한다. 그러나 당신이 위에서 말한 무의미한 코드를 복제하려고 시도하는 것은 무리이다. –

+0

(고마워, 두 번만 더 기대하고, 나는 불합리한 배지를 얻는다.) 왜 무의미한가? 그것은 나에게 합법적 인 질문처럼 보입니다. 비록 hasMany 접근법이 문제를 피할지라도, 나는 여전히 params 맵을 조작하고 그것이 작동하도록 기대할 것이다. 왜 그런지 모르겠다. –

관련 문제