Neo4j стремится загрузить ActiveRel
Я пытаюсь получить конкретные ключевые слова, которые МОГУТ быть связаны ТОЛЬКО с конкретными пользователями и вернуть отношения.
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
поэтому для всего фрагмента будет выполнен только один запрос.
(Другим решением было бы запустить для каждого ключевого слова и получить его помеченных пользователей, но это также требует много запросов.)
1 ответ
Решение было добавить with_associations
поэтому нам даже не нужен объект отношения.
def self.uids_to_keywords(keywords, user_ids)
Keyword.where(text: keywords).tagged_users.with_associations(:keywords)
.where(user_id: user_ids).each_with_object({}) do |user, obj|
obj[user.user_id] = keywords & user.keywords.map(&:text)
end
end