Динамически создаваемые скользкие запросы
У меня есть три таблицы: пользователи, группы и группы пользователей. От групп и пользователей есть отношение многие ко многим, потому что один пользователь может принадлежать нескольким группам, а группа состоит из нескольких пользователей.
У меня есть запрос 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 _)