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
을 입력하면 entry
은 null
입니다. 기본적으로 :
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
및 _entry
이 beforeValidate()
에 null
을 것을 발견했다. 나는 이것이 왜 일어나는 지 이해하지 못한다. params
에 새 키를 추가하면 null이 도메인 클래스에 도착하게됩니까?
물론 후속 질문은 비계 작성 항목 양식을 파이프로 구분 된 문자열을 받아 데이터베이스에 넣는 올바른 방법일까요?
글쎄, 잘 알고 있습니다. 외관상으로는, 나는 날짜가 기입 된 정보를보고 있었다. 하지만 스캐 폴딩이 이것을 처리 할 수 없다는 것을 알 수 있습니다. 해결 방법이 있습니까? 이 사실을 알려 주셔서 감사 드리며 답변을 드리겠습니다. 하지만 params 배열에 어떤 일이 일어나고 있는지 이해할 수 없기 때문에 여전히 내 질문에 대한 대답을 원합니다. –
나는 둘 중 하나를 이해하지 못한다. 그러나 당신이 위에서 말한 무의미한 코드를 복제하려고 시도하는 것은 무리이다. –
(고마워, 두 번만 더 기대하고, 나는 불합리한 배지를 얻는다.) 왜 무의미한가? 그것은 나에게 합법적 인 질문처럼 보입니다. 비록 hasMany 접근법이 문제를 피할지라도, 나는 여전히 params 맵을 조작하고 그것이 작동하도록 기대할 것이다. 왜 그런지 모르겠다. –