1

DocumentとAuthorの2つのドメインオブジェクトがあるとします。

Class Document {
    Author author
    String title
}

Class Author {

    String lastName
    String firstName

    String toString() {

        return lastName + ", " + firstName
    }
}

ビューlist.gspは次のようになります。

<g:sortableColumn property="title" title=... />
<g:sortableCOlumn property="author" title=... />

....

<td>${fieldValue(bean: documentInstance, field: "author"}></td>
<td>${fieldValue(bean: documentInstance, field: "title"}></td>

テーブルに表示される値は意図したとおりに機能します。テーブルの行には、documentInstance.titleの横に作成者が(lastName、firstName)として表示されます。

ただし、作成者列ヘッダーをクリックして並べ替えると、「ドキュメント」はauthor.idで並べ替えられます。

author.idで並べ替える代わりに、author.toString()または "author.lastName、author.firstName"で並べ替える最も便利な方法は何ですか?

可能であれば、.withCriteria {}にフォールバックしないようにします。この機能を必要とする4つの異なる列があり、面倒になるようです。

4

2 に答える 2

3

派生プロパティを使用して、並べ替え対象の仮想列を作成できます。

Class Author {

    String lastName
    String firstName
    String sortingName

    static mapping {
        // modify the SQL formula to use your DB's concatenation operator
        sortingName formula: "`LAST_NAME` || ',' || `FIRST_NAME`)" // Standard SQL
    }

    String toString() { sortingName }
}

次に、列を次のように設定しますsortingName

<g:sortableColumn property="author.sortingName" title=... />

(私はここで推測していますが、これはうまくいくと思います。)

于 2012-04-15T15:57:59.717 に答える
2

私はGrailsの初心者なので、答えが最適ではないかもしれませんが、これが私にとって最も簡単な方法でした。

使用する代わりに、Document.list(params)を使用しDocument.findAll()ました。私のアプリケーションでは、リストにある種のフィルターが必要findAll()だったので、それが最善のアプローチであったことを言及する価値があります。とにかく、これが私がそれをする方法です:

Document.findAll( "from Document as d order by d." + params.sort + ' ' + params.order, params ) //supports pagination

そして、ビューで:

<g:sortableCOlumn property="author.lastName" title=... />
于 2012-04-15T16:14:24.223 に答える