У меня есть куча данных, и мне нужен фильтр данных с использованием Grails - PullRequest
3 голосов
/ 22 июня 2010

Я пытаюсь создать фильтр для своих данных, чтобы другие люди могли его видеть, скажем, у меня есть куча событий, например календарь, и я хочу видеть все, у которых есть имя или заголовок со словом "Футбол" ». Я пытался понять, как это сделать, но у меня ничего не работает, я также пытался использовать плагин filterPane, но он не работал так же хорошо, и я предпочитаю написать что-то сам и, возможно, загрузить его на страницу плагинов Grails для будущего ссылки,

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

4 голосов
/ 23 июня 2010

Если это в доменном классе, попробуйте:

def matches = Book.findAllByTitleLike("wonderful")

из, если вы не хотите беспокоиться о верхнем / нижнем регистре:

def matches = Book.findAllByTitleILike("wonderful")

Если названия ваших книг в коллекции:

def books = ['Wonderful Tonight', 'Atlas Shrugged', 'A Tale of Two Cities']
def matches = books.findAll{it.indexOf("wonderful") > -1} // returns []
matches = books.findAll{it.indexOf("Wonderful") > -1} // returns ['Wonderful Tonight']
matches = books.findAll{it.toLowerCase().indexOf("wonderful") > -1} // returns ['Wonderful Tonight']

Обновление:

Итак, теперь, когда у нас есть более полное описание вашей проблемы, давайте найдем упрощенный способ ее решения.

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

Наш общий поток будет примерно таким:

  1. Вы отображаете форму поиска для своего пользователя
  2. Пользователь вводит дату и / или заголовок для поиска и отправляет форму
  3. Вы найдете подходящие записи
  4. Вы отображаете соответствующие записи для пользователя

Сначала давайте создадим представление для формы поиска в grails-app / views / entry / и создадим файл с именем search.gsp со следующим содержимым:

<g:form controller='entry' action='searchResults'>
   Entry Title: <g:textField name="title" value="${title}" />
   Entry Date: <g:datePicker name="day" value="${day}" precision="day" />
   <g:submitButton name="submit" value="Search" />
</g:form>

Далее мы создадим контроллер. В grails-app / controllers / создайте новый контроллер EntryController.groovy. Вы можете сделать это, выполнив «запись grails create-controller», если EntryController еще не создан.

Теперь мы создадим два замыкания контроллера:

def search = {
  render(view:'search')
}

и

def searchResults = {
  def entryCriteria = Entry.createCriteria()
  def results = entryCriteria.list {
    if(params?.title) {
      ilike{"title","%${params.title}%"
    }
    if(params?.day) {
      eq("eventDate", params.day)
    }
  }
  render(view:'searchResults', model:['results':results])
}

Наконец, давайте создадим searchResults.gsp в grails-app / views / entry

<h1>Results</h1>
<g:each in=${results}>
  ${it}
</g:each>

Итак, теперь собираем все вместе:

  1. Запустите ваше приложение и перейдите по адресу localhost: 8080 / $ {appName} / entry / search, и это должно вызвать вашу форму поиска.
  2. Введите заголовок и / или дату, отправьте форму, которая должна отправить данные вашей формы в замыкание searchResults в вашем контроллере
  3. Поиск критериев в закрытии найдет все записи, соответствующие вашим критериям поиска
  4. Вы визуализируете представление результатов поиска и передаете ему соответствующие записи, затем в gsp мы перебираем каждый из результатов и отображаем его.

Как заявление об отказе, я пишу этот код на лету в текстовом редакторе переполнения стека, поэтому я не удивлюсь, если есть пара синтаксических проблем, которые я пропустил. Надеюсь, объяснений будет достаточно, чтобы вы пошли. Теперь давайте поговорим о том, чтобы взять этот базовый пример и довести его до более приемлемого решения.

Я бы порекомендовал вам попробовать сделать следующее после ознакомления с базовым примером:

  1. Попробуйте создать командный объект для представления формы поиска, это позволит вам проверить правильность ввода вашего пользователя и является более управляемым подходом, чем прямая работа с параметрами запроса, как я делал выше.
  2. Создайте несколько модульных тестов для вашего командного объекта и потока контроллера; убедитесь, что сообщения об ошибках заполняются для различных проверок.
  3. Возьмите критерий поиска, который мы определили в замыкании searchResults, и переместите его в отдельную службу Grails, передайте объект командной строки в службу для получения результатов. Затем вы можете повторно использовать функцию поиска, если она вам понадобится позже в вашем приложении.
  4. Создайте несколько юнит-тестов для вашего сервиса; макет объекта домена Entry и убедитесь, что ваша функция поиска работает правильно.

Если вы изо всех сил пытаетесь заставить работать вышеупомянутое решение, попробуйте упростить его еще больше. Исключите поиск даты и просто поиск по названию. Замените всю логику критериев в действии searchResults на:

def results = Entry.findByTitleILike(params?.title)

Начните с простого и улучшайте, и вы быстро освоитесь.

Удачи!

1 голос
/ 23 июня 2010

Плагин filter соответствует вашим требованиям.

1 голос
/ 23 июня 2010

Вы можете запросить пример или использовать findAllWhere, если вам нужно только фильтровать по равенству В противном случае вам нужно будет использовать построитель критериев для генерации соответствующего запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...