(对不起,如果这是一个菜鸟问题,我找不到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 = {
}
}
当我创建调查时,我首先看到这样的屏幕:
我填写调查名称,然后点击添加调查问题,然后看下一个屏幕:
但它需要设置调查,但尚未完成。
问题:我是否必须先创建并保存调查,然后对其进行编辑并添加调查问题(在创建回复之前,每个调查问题都需要创建和保存),或者是有没有办法在我创建父对象时添加子对象?
我想使用动态脚手架,所以我不必手动创建控制器和视图。
问题和答案完全独立,不会在整个层次结构中重复使用。
答案 0 :(得分:4)
使用该用户界面,您应该创建,保存和添加。更好的方法是创建主/详细用户界面。你可以在这里看到这种方法:
https://github.com/leadVisionary/Grails-Survey-Module
http://programmingitch.blogspot.com/2009/10/data-binding-for-one-to-many.html
http://omarello.com/2010/08/grails-one-to-many-dynamic-forms/
http://java.dzone.com/articles/creating-master-detail-forms
http://kapilpandit.wordpress.com/2009/02/25/complex_form_grails/
答案 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 = [调查:调查]
然后,如果您没有这种关系,您可以创建一个模板来创建问题,并在保存之前将它们添加到调查对象中的问题集合中!