0

У меня есть приложение со следующими лицами:критерии в отношении между субъектами - Grails

Тема:

class Topic { 

    UUID id 
    String description 
    String name 
    boolean visibility = true 

    // Relation 
    static hasMany = [tests:Test] 
    ... 
} 

Тест:

class Test { 

    UUID id 
    boolean active = true 
    String description 
    ... 

    static hasMany = [evaluationsTest: Evaluation] 
    static belongsTo = [topic: Topic, catalog: Catalog] 
} 

Когда я показываю все видимые теги к пользователю Я запрашиваю запрос:

def visibleTopics = Topic.findAllByVisibility(true, [sort:"name", order:"asc"]) 

Этот запрос возвращает меня, например: [['English'], ['Spanish']]. Затем я могу показать полную информацию о каждой теме для пользователя.

Но я также хочу указать пользователю количество активных тестов в каждой видимой теме.

Например:

English topic has 2 active test. 
Spanish topic has a total of 2 test. One is active and the other is not. 
German topic has not any active test. 

Тогда я нужен запрос, чей результат: def activeTotalEachTopic = [[2],[1],[0]] и я могу передать переменную activeTotalEachTopic к представлению (.gsp).

Решение:

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

def visibleTopics = Topic.findAllByVisibility(true, [sort:"name", order:"asc"]) 

def numberActiveTest = [] 

activeTopics.each { topic -> 
    def result = Test.findAllByTopicAndActive(topic, true).size() 
    numberActiveTest.push(result) 
} 

И я перехожу к виду обеих переменных.

render view: 'home', model: [activeTopics: activeTopics, numberActiveTest: numberActiveTest] 

ответ

0

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

Вам также необходимо изменить тип соединения от внутреннего соединения по умолчанию к внешнему соединению, чтобы темы без активного теста возвращали 0. Однако побочным эффектом этого является то, что он изменяет способ привязки свойств ассоциации из-за псевдонима, созданного соединением. Что-то вроде этого:

import static org.hibernate.sql.JoinType.* 

def activeTotalEachTopic = Topic.createCriteria().list() { 
    createAlias('tests', 't', LEFT_OUTER_JOIN) 

    eq 'visibility', true 

    or { 
     eq 't.active', true 
     isNull 't.id' 
    } 

    projections { 
     groupProperty 'name' 
     count() 
    }   
    order ("name", "asc") 
} 

Теперь другой вопрос, адрес в том, что результат будет что-то подобное в связи с группировкой: [['English', 2],['Spanish', 1],['German', 0]]. Итак, что вы можете сделать, это собрать второй элемент в каждом подписок:

activeTotalEachTopic*.getAt(1) 

// Which is the equivalent of... 

activeTotalEachTopic.collect { it[1] } 
+0

Спасибо. Это не работает отлично. Он показывает только те темы с активным тестом, поэтому: «[['English', 2], ['Spanish', 1]]'. ** Немецкая тема ** отсутствует в списке. –

+0

ОК, я исправил нулевую проблему. Проблема в том, что когда нет связанного теста, 't.active' становится null, что приводит к сбою условия. Так что нулевая проверка исправит это. –

+0

Проблема продолжается. Темы без активного теста не отображаются. Если раздел проецирования опущен, в нем отображаются только две темы; третий не появляется (немецкий). –

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

  • Нет связанных вопросов^_^