Динамически создаваемые скользкие запросы

У меня есть три таблицы: пользователи, группы и группы пользователей. От групп и пользователей есть отношение многие ко многим, потому что один пользователь может принадлежать нескольким группам, а группа состоит из нескольких пользователей.

У меня есть запрос GET, как /group? Name=X&user=Y

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

def findUserGroups(id: Long) = {
   users_groups.filter(ug => ug.userID === id)
} 

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

var queries : List[Query[GroupsTable, GroupsTable#TableElementType, Seq]]= List[Query[GroupsTable, GroupsTable#TableElementType, Seq]]()
userGroups map { userGroup =>    
    val query : Query[GroupsTable, GroupsTable#TableElementType, Seq] = groups.filter(_.id =!= userGroup.group.get)
    queries = query :: queries
}

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

Наконец я пробовал союз

def findGroupByNameSynthFunction(name: String, queries: List[Query[GroupsTable, GroupsTable#TableElementType, Seq]]) = {
    val query1 = groups.filter(g => g.name like ("%" + name + "%"))
    val unionQuery: Query[GroupsTable, GroupsTable#TableElementType, Seq] = query1
    queries map { query =>
       unionQuery ++ query
    }
    unionQuery
} 

Я исполняю это

val found = GroupsTable.findGroupByNameSynthFunction(name, queries).run

Но я все равно получаю все группы.

Может кто-то объяснил мне, что я делаю очень неправильно!?:)

1 ответ

Я не уверен, где именно у вас было неправильное ожидание, но это, вероятно, вращается вокруг выражения

queries map { query =>
   unionQuery ++ query
}

Это не имеет никакого побочного эффекта. Если вы не делаете что-то с результирующим значением (а вы нет), это ничего не делает. Вы, вероятно, хотите что-то вроде

def findGroupByNameSynthFunction(
    name: String,
    queries: List[Query[GroupsTable, GroupsTable#TableElementType, Seq]]
) = queries.map(_.filter(_.name like ("%" + name + "%")))
           .reduce(_ union _)
Другие вопросы по тегам