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

时间:2012-08-30 15:22:15

标签: grails grails-2.1

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

我有以下域名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 = {
    }
}

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

(survey)

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

(survey question)

但它需要设置调查,但尚未完成。

问题:我是否必须先创建并保存调查,然后对其进行编辑并添加调查问题(在创建回复之前,每个调查问题都需要创建和保存),或者是有没有办法在我创建父对象时添加子对象?

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

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

4 个答案:

答案 0 :(得分:4)

答案 1 :(得分: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))
}

在视图中(假设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"/>

在您的控制器中执行addQuestion操作:

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

编辑是另一个主题,但工作原理相同。

看一下这篇博文:

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

答案 2 :(得分:2)

如果您在questions课程中将List声明为Survey,那么您的观点将能够通过索引访问它们。

List questions
static hasMany = [questions: SurveyQuestion]

在您的GSP表单中,您可以使用以下内容:

<g:textField
    name="questions[0].question"
    value="${surveyInstance?.questions?.size() > 0 ? surveyInstance?.questions[0]?.question : ''}"/>

价值的三元素有点粗糙,但很容易隐藏在你自己的标签中。

如果您确实需要使用动态脚手架,则可以覆盖单个视图或用于生成视图的模板。或者,您可以使用fields plugin呈现questions属性的输入。

我创建了一个简单的应用程序&amp;在那一切似乎只是工作。我期望必须编写一个PropertyEditor实现来增加列表,但Grails 2.1似乎会为你做这个。

重新排序或删除问题需要更多实验,但更新问题是有效的,即问题文本已更改,而不是正在创建的新SurveyQuestion实例。

答案 3 :(得分:0)

如果您要重复使用这些问题......也许您不应该使用belongsTo = [调查:调查]

然后,如果您没有这种关系,您可以创建一个模板来创建问题,并在保存之前将它们添加到调查对象中的问题集合中!

相关问题