Я пытаюсь получить конкретные ключевые слова, которые МОГУТ быть связаны ТОЛЬКО с конкретными пользователями, и вернуть отношения.
Keyword.where(text: ['key1', 'key2'])
.tagged_users(:u, :rel)
.where(uid: [100, 101])
.pluck(:rel).each_with_object({}) do |rel, obj|
uid = rel.to_node.uid
keyword = rel.from_node.text
obj[uid] ? obj[uid] << keyword : obj[uid] = [keyword]
end
Предполагая, что у нас только одна связь с пользователем 100, помеченным ключевым словом 'key2', желаемый результат равен {100 => ['key2']}
Приведенный выше код работает, но для каждого rel
он выполняет 2 запроса к БД; один для rel.to_node
и один для rel.from_node
.
Я надеялся, что есть решение для «быстрой загрузки» rel.from_node
и rel.to_node
, поэтому для всего фрагмента будет выполнен только один запрос.
(Другое решение - запускать для каждого ключевого слова и получать его помеченных пользователей, но это также требует много запросов.)