在创建域对象之前将子元素添加到域对象

Jim*_*mmy 9 grails grails-2.1

(对不起,如果这是一个菜鸟问题,我找不到grails参考的答案)

我有以下域名heirarchy:

用户 >(有很多)调查 >(有很多)SurveyQuestion >(有很多)SurveyQuestionResponse

这些是以上两个:

class Survey {

    String surveyName

    static hasMany = [questions: SurveyQuestion]
    static belongsTo = [user:User]
    static constraints = {
    }
}

class SurveyQuestion {

    String question

    static hasMany = [responses : SurveyQuestionResponse]
    static belongsTo = [survey:Survey]

    static constraints = {
    }
}
Run Code Online (Sandbox Code Playgroud)

当我创建调查时,我首先看到这样的屏幕:

(调查)

我填写调查名称,然后点击添加调查问题,然后看下一个屏幕:

(调查问题)

但它需要进行调查,但尚未完成.

问题:我是否必须首先创建和保存调查,然后编辑它并添加调查问题(在创建响应之前,每个问题都需要单独创建和保存),或者有没有办法添加子对象,因为我' m创建父对象?

我想使用动态脚手架,所以我不必手动创建控制器和视图.

问题和答案完全独立,不会在整个层次结构中重复使用.

Chr*_*ris 4

您应该使用命令对象。这样您就可以在创建父元素时轻松添加子元素。例如

class CreateSurveyCommand {
     String surveyName
     List<SurveyQuestion> surveyQuestions = 
         org.apache.commons.collections.list.LazyList.decorate(
             new ArrayList(), 
             new org.apache.commons.collections.functors.InstantiateFactory(SurveyQuestion.class))
}
Run Code Online (Sandbox Code Playgroud)

在视图中(假设index.gsp)你有类似的东西:

<g:textField name="surveyName" value="${cmd?.question}" />
<g:each in="${cmd.surveyQuestions}" var="surveyQuestion" status="i">
    <g:textField
        name="surveyQuestions[i].question" 
        value="${cmd?.surveyQuestions[i].question}" />
</g:each>
<g:actionSubmit action="addQuestion"/>
Run Code Online (Sandbox Code Playgroud)

addQuestion在你的控制器中有一个动作:

def addAction(CreateSurveyCommand cmd) {
    cmd.surveyQuestions.add(new SurveyQuestion())
    render(view:"index", model: [cmd: cmd])
}
Run Code Online (Sandbox Code Playgroud)

编辑是另一个主题,但工作方式相同。

看看这篇博文:

http://blog.andresteingress.com/2012/06/29/groovy-2-0-love-for-grails-command-objects