1

のリストを保持するドメインクラスが必要でしたStrings。GORMがこれを処理できないことはかなりよく知られているように思われるので、私はそれを回避しました。最初はドメインクラスでゲッターとセッターを使ってみましたが、問題が発生しました。次に、Stack Overflowで、以下に示すようにプロパティを使用afterLoad()および書き換える方法を見つけました。これは、を永続化のために、そしてアプリで使用するために戻すことbeforeValidate()ができるようにするためにうまく機能しました。ListStringList

    class Entries {
        // persisted to database
        String _entry

        // exposed to app
        List entry

        static transients = ['entry']   //don't try to persist the List

        def afterLoad() {
                            // split the String from the database into a List
            entry = _entry?.split('\\|')
        }

        def beforeValidate() {
                            // join the List into a String for persisting
            _entry = entry.join('|')
        }

        static constraints = {
            _entry maxSize:4000
        }
    }

これはプログラムで正常に機能します。唯一の問題は、パイプで区切られた文字列を入力しようとしても、Grailsスキャフォールディングがこれを処理できないことです。_entryスキャフォールディングがのフォームフィールドを作成するためentry、オブジェクトを保存しようとするとnullになる理由を理解しています。そしてbeforeValidate()、文字列のリストに依存して機能します。

params.entry = params._entryを呼び出す前に、を設定して、コントローラーでこれを回避しようとしましたnew Entries(params)。[これは完璧な解決策ではないことを認識していますが、これがフォームを機能させるための最初のパスでした。]次に、テストを追加して、であるかどうかbeforeValidate()を設定しました。基本的に:entry = _entryentrynull

EntrancesController.groovy:

params.entry = params._entry    // I added this line
def entriesInstance = new Entries(params)

Entrances.groovy:

    def beforeValidate() {
        if( entry == null ) entry = _entry    // I added this line
        _entry = entry.join('|')
    }

これにより、パイプで区切られた文字列をスキャフォールドの[エントリの作成]フォームに入力して、データベースに何かを取得できるようになると思いました。

驚いたことに、コントローラーに両方のキーが含まれていることを印刷して確認したにもかかわらず、両方entry_entrynull入っていることがわかりました。なぜこれが起こるのかわかりません。ドメインクラスにヌルが到着するように新しいキーを追加するにはどうすればよいですか?beforeValidate()paramsparams

フォローアップの質問は、もちろん、スキャフォールド化されたエントリの作成フォームがデータベースに入るパイプ区切りの文字列を受け入れるようにする正しい方法は何ですか?

4

1 に答える 1

2

文字列のリストを保持するドメイン クラスが必要でした。GORM がこれを処理できないことはかなりよく知られているように思われるので、私はそれを回避しました。

私はここであなたに同意しません

class Xyz {

static hasMany = [entries: String]

}

文字列のリストを保持する別のテーブルを作成する必要があります (実際にはセットになります)。ここにドキュメントがあります

于 2013-01-10T04:43:13.583 に答える