2012-04-15 6 views
1

Предположим, что у меня есть два объекта домена, документа и авторGrails sortableColumn с несколькими полями

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> 

Отображаемые значения в таблице работы как предназначено - строка таблицы покажет автору как (lastName, firstName) рядом с documentInstance.title.

Однако, щелкнув заголовок столбца Author для сортировки, необходимо отсортировать «документы» с помощью author.id.

Каков наиболее целесообразный способ сортировки по author.toString() или "author.lastName, author.firstName" вместо сортировки author.id?

Я бы предпочел не возвращаться к .withCriteria {}, если возможно - у меня есть четыре разных столбца, которым нужна эта функциональность, и похоже, что это будет беспорядочно.

ответ

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=... /> 
+1

Я закончил использовать withCriteria ... Я собираюсь отметить это как ответ, поскольку похоже на самое чистое решение вопроса «как задано». Благодаря! – MT1

3

Вы можете использовать derived property создать виртуальный столбец для сортировки:

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=... /> 

(Я вроде угадывания, но я подумайте, что это должно сработать.)

+0

Это звучит, как он должен работать, но я предпочел бы не включать в себя прямое использование SQL, если я могу избежать Это. Спасибо за идею. – MT1

+0

Предполагая, что в http://grails.org/doc/latest/guide/GORM.html#derivedProperties пункт 7.5.2.11 после сортировкиName не должно быть двоеточия. – MNie

+0

@Tadek Хорошая добыча, кажется, что вы правы. Это проблема с DSL, как это, хотя иногда бывает трудно сказать, что такое свойство и что такое вызов функции. :-) – OverZealous

Смежные вопросы