9

(これが初心者の質問である場合は申し訳ありませんが、grailsリファレンスで回答が見つかりませんでした)

私は次のドメイン階層を持っています:

ユーザー>(多数あります)調査>(多数あります)SurveyQuestion >(多数あります)SurveyQuestionResponse

これらは上記の2つです:

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 = {
    }
}

調査を作成すると、最初に次のような画面が表示されます。

(調査)

アンケート名を入力し、[アンケートの質問を追加]をクリックすると、次の画面が表示されます。

(調査質問)

ただし、まだ完了していない調査を設定する必要があります。

質問:最初にアンケートを作成して保存してから、編集してアンケートの質問を追加する必要がありますか(回答を作成する前に、それぞれを個別に作成して保存する必要があります)、または子オブジェクトを追加する方法はありますか? m親オブジェクトを作成しますか?

動的なスキャフォールディングを使用したいので、コントローラーとビューを手動で作成する必要はありません。

質問と回答は完全に独立しており、階層全体で再利用されることはありません。

4

4 に答える 4

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/

于 2012-08-30T15:37:33.023 に答える
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

于 2012-09-03T11:22:17.903 に答える
2

クラスでquestionsとして宣言すると、ビューはインデックスでそれらにアクセスできるようになります。ListSurvey

List questions
static hasMany = [questions: SurveyQuestion]

フォームGSPでは、次のようなものを使用できます。

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

値の3値は少し粗雑ですが、自分のタグに簡単に隠すことができます。

動的スキャフォールディングを本当に使用する必要がある場合は、個々のビューまたはビューの生成に使用されるテンプレートをオーバーライドできます。または、 fieldsプラグインを使用して、プロパティの入力をレンダリングすることもできquestionsます。

シンプルなアプリを作成しました。その時点で、すべてが正常に機能しているように見えます。リストを増やすために実装を書かなけれPropertyEditorばならないと思っていましたが、Grails2.1がこれをやってくれるようです。

SurveyQuestion質問の並べ替えや削除にはさらに実験が必要ですが、質問の更新は機能します。つまり、新しいインスタンスが作成されるのではなく、質問のテキストが変更されます。

于 2012-09-05T14:53:23.267 に答える
0

質問を再利用する場合は...belongsTo= [survey:Survey]を使用しないでください。

次に、この関係がない場合は、質問を作成するためのテンプレートを作成し、保存する前にそれらを調査オブジェクトの質問コレクションに追加できます。

于 2012-08-30T15:42:40.897 に答える