Фильтрация отфильтрованных данных - PullRequest
0 голосов
/ 29 января 2012

Я новичок в Grails и MVC, поэтому, пожалуйста, потерпите меня.

У меня есть ссылки на мой GSP, которые выполняют статическую фильтрацию. Например, приведенный ниже пример возвращает только
эти Request экземпляры класса домена со статусом Открыть . Но я также хочу иметь возможность выполнять динамическую фильтрацию на той же модели ( результаты в коде ниже).

Вариант использования будет выглядеть примерно так: пользователь видит все Request экземпляры класса домена в таблице. Он нажимает на ссылку Открытые запросы и получает только те Request экземпляров, которые имеют статус свойство со значением Open . Затем он устанавливает dateFrom и dateTo, используя элемент управления выбора даты, и нажимает кнопку Filter , которая вызывает метод / действие, которое дополнительно фильтрует данные из таблицы. Таким образом, он должен возвращать только те запросы, которые открыты и созданы в течение указанного периода.

def openedRequests = {
    def contact = Contact?.findByUser(springSecurityService.currentUser)
    def productlines = contact.productlines()
    def requestCriteria = Request.createCriteria()      
    def results = requestCriteria.list {
        eq("status", "Open")
        and {
            'in'("productline",productlines)
        }

    }
    render(view:'supportList', model:[requestInstanceList:results, requestInstanceTotal: results.totalCount])
}

EDIT На моем GSP есть несколько ссылок, которые вызывают действия контроллера, которые выполняют фильтрацию экземпляров некоторого класса домена. Например, у меня есть OpenedRequests, ClosedRequests, NewRequests. Но у меня также есть некоторые текстовые поля, комбинированные списки, элементы управления datePicker для дополнительной фильтрации. Я вызываю действие filterRequests с помощью кнопки.

def filterRequests = {
    def contact = Contact?.findByUser(springSecurityService.currentUser)
    def productlines = contact.productlines()
    def requestCriteria = Request.createCriteria()
    def results = requestCriteria.list {
        if(params.fDateFrom && params.fDateTo){
            def dateFrom = new SimpleDateFormat("dd.MM.yyyy").parse(params.fDateFrom_value)
            def dateTo = new SimpleDateFormat("dd.MM.yyyy").parse(params.fDateTo_value)
            between("dateCreated",dateFrom,dateTo)
        }
        if(params?.fStatus){
            eq("status",params.fStatus)
        }
        if(params?.fCompany){
            eq("company", params.fCompany)
        }
        and {'in'("productline",productlines)
        }
        if(params.sort != null && params.order !=  null){
            order(params.sort, params.order)
        }
    }
    render(view:'supportList', model:[requestInstanceList:results, requestInstanceTotal: results.totalCount])

}

Я хочу иметь возможность фильтровать экземпляры запроса по некоторым из упомянутых ссылок, а затем установить дополнительные фильтры, например, dateFrom i dateTo с datePicker. Я хочу, чтобы эти фильтры знали о предыдущей фильтрации со ссылкой, если таковые были. Как правильно это сделать?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2012

Дэвид предложил мне использовать Отдельные критерии, но я использую Grails 1.3.7 для своего приложения.Итак, на данный момент это не вариант.Я также думал об использовании представлений базы данных и хранимых процедур, но я не был уверен, как это будет работать с Grails (но это то, что я обязательно должен изучить), и я хотел получить некоторые результаты быстро, поэтому я сделал что-то не очень СУХОЕ.Когда я фильтрую таблицу с одной из упомянутых ссылок, я сохраняю имя ссылки / действия в сеансе и в действии filterRequest (которое выполняет дополнительную фильтрацию), я проверяю сеанс, чтобы увидеть, была ли какая-либо предыдущая «фильтрация ссылок», и если этогде я применяю эти фильтры к таблице с критериями, и после этого я применяю фильтры, которые были введены вручную.Мне это не нравится, но это все, что я придумал, с моим ограниченным пониманием Грааля.Ниже мое действие filterRequest:

def filterRequests = {
    def contact = Contact?.findByUser(springSecurityService.currentUser)
    def productlines = contact.productlines()
    def requestCriteria = Request.createCriteria()
    def results = requestCriteria.list {
        if(session.filter == "newRequests"){
            and{
                isNull("acceptedBy")
                ne("status", "Closed")
            }
        }
        if(session.filter == "openRequests"){
            and{
                ne("status",'Closed')
            }
        }
        if(session.filter == "closedRequests"){
            and{
                eq("status", "Closed")
            }
        }   

        if(session.filter == "myRequests"){
            and{
                eq("acceptedBy", contact.realname)
            }
        }


        if(params.fDateFrom && params.fDateTo){
            def dateFrom = new SimpleDateFormat("dd.MM.yyyy").parse(params.fDateFrom_value)
            def dateTo = new SimpleDateFormat("dd.MM.yyyy").parse(params.fDateTo_value)
            and{
                between("dateCreated",dateFrom,dateTo)
            }
        }
        if(params?.fAcceptedBy){
            and{
                eq("acceptedBy", params.fAcceptedBy)
            }
        }
        if(params?.fStartedBy){
            and{
                eq("startedBy", params.fStartedBy)
            }
        }
        if(params?.fCompany){
            and{
                ilike("company", "%" + params.fCompany +"%")
            }   
        }
        and {'in'("productline",productlines)
        }
        if(params.sort != null && params.order !=  null){
            order(params.sort, params.order)
        }
    }
}
0 голосов
/ 30 января 2012

Вы можете использовать DetachedCriterias , который был представлен в Grails 2.0.

A DetachedCriteria не зависит от любого сеанса и может быть легко использован повторно:

def openRequests = new DetachedCriteria(Request).build {
     eq("status", "Open")
     and {
        'in'("productline",productlines)
     }
}

Затем при следующем запросе дополнительного фильтра вы можете повторно использовать DetachedCriteria и выполнить подзапрос, например:

def results = openRequests.findByStartDateBetweenAndEndDateBetween(dateFrom, dateTo, dateFrom, dateTo)

Конечно, вы должны как-то вспомнить, каким был исходный запрос (сеанс, параметр запроса), чтобы использовать правильные критерии в качестве основы для подзапроса.

(Отказ от ответственности: я сам еще не пробовал отдельные критерии)

...