Grails - Сортировка вывода списка, не имея необходимость иметь модель SortedSet или Comparable?

Я повреждаю голову против стены о том, что я думаю, была бы очень простая проблема для разрешения в Grails:

Скажите, что у меня есть подобная корзине модель; так класс Корзина, что hasMany объекты и каждый объект belongsTo корзина. В целом я не забочусь о порядке пунктов в корзине - я не забочусь о том, что приказывает, чтобы они были сохранены в, вычислены в, и т.д. ОДНАКО я действительно хочу ОТОБРАЗИТЬ их в том же порядке. Мне кажется, что эта логика должна смочь существовать ПОЛНОСТЬЮ в слое представления, но единственные решения, которые я смог найти, говорят мне объявлять объекты как SortedSet в образцовом слое. Это также влияет на мой слой контроллера, поскольку простые операции Списка, такие как .collect {} теперь требуют, чтобы дополнительный синтаксический переход вокруг для хранения преобразований типов исправил и сохранил мою сортировку.

Мне это гаек, таким образом, я должен пропускать что-то простое! Есть ли любой способ, например, сделать что-то как <g:each in="${cart.items.sort{it.name}}"> или что-то подобное, так, чтобы я мог осуществить последовательный порядок дисплея ТОЛЬКО в выводе / слой представления? РЕДАКТИРОВАНИЕ - Видит ответ Matt ниже; версия этого действительно на самом деле работает.

Спасибо за любой совет или указатели!

6
задан Arturo Herrero 24 May 2012 в 17:08
поделиться

2 ответа

Я думаю, что ваш пример с твиттером хорош. Требуется база данных для долгосрочных данных. Не было бы большого пункта поместить твит в сообщение, потому что он должен быть в базе данных. Тем не менее, если вы вели чат комнаты то вы можете продолжить и поместить сообщение в очередь JMS, потому что вы не сохраняете его долго.

Это не то, что вы не можете поместить твит в JMS, это то, что вы должны поместить его в базу данных в любом случае.

-121--3879887-

Я рекомендую вам взглянуть на книгу Грегора Хофа Узоров интеграции предприятия , в которой объясняется множество различных узоров для подходов на основе обмена сообщениями.

-121--3879884-

Этот сторонний тэг , похоже, сделает то, что вам нужно. В противном случае всегда можно создать собственный тэг. Класс Тэга может выполнять сортировку следующим образом:

class SortTagLib {

    static namespace = 'sort'

    def sort = { attrs ->

        // A closure that does the sorting can be passed as an attribute to the tag.
        // If it is not provided the default sort order is used instead
        def sorter = attrs.sorter ?: {item1, item2 -> item1 <=> item2}
        sorter = sorter as Comparator        

        // The collection to be sorted should be passed into the tag as a parameter
        Collections.sort(attrs.items, sorter)
    }
}

Этот тэг можно использовать для сортировки коллекции объектов по свойству name:

<sort:sort items="someCollection" sorter="${someComparatorClosure}"/>

Коллекция, на которую ссылается someCollection , будет отсортирована по месту при выполнении тэга.

4
ответ дан 8 December 2019 в 03:53
поделиться

Вы также можете использовать методы сортировки, доступные для коллекций / карт, как определено здесь: http://groovy.codehaus.org/api/org/codehaus/groovy/runtime/DefaultGroovyMethods .html

Лично я обнаружил, что это довольно легко сделать в сочетании с тегом в моем GSP:

<!-- Books sorted by title -->
<g:each in="${ books.sort{a,b-> a.title.compareTo(b.title)} }">
    <p>Title: ${it.title}</p>
    <p>Author: ${it.author}</p>
</g:each>

Чтобы узнать о других способах управления коллекциями и картами, я рекомендую эту страницу и эту страницу соответственно.

23
ответ дан 8 December 2019 в 03:53
поделиться