(对不起,如果这是一个菜鸟问题,我找不到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创建父对象?
我想使用动态脚手架,所以我不必手动创建控制器和视图.
问题和答案完全独立,不会在整个层次结构中重复使用.
您应该使用命令对象。这样您就可以在创建父元素时轻松添加子元素。例如
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