2012-04-15 74 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> 

顯示值在表中作爲工作打算 - 表格行將在documentInstance.title旁邊顯示作者(lastName,firstName)。

但是,單擊作者列標題進行排序會導致「文檔」按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 2012-04-30 21:41:45

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 2012-04-22 22:01:36

+0

假設http://grails.org/doc/latest/guide/GORM.html#derivedProperties點7.5.2.11,sortName之後不應該有冒號。 – MNie 2014-11-10 12:46:32

+0

@Tadek很好的發現,看起來你是對的。這就是DSL這樣的問題,但是,有時很難分辨什麼是屬性,什麼是函數調用。 :-) – OverZealous 2014-11-10 20:02:59