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
Другие вопросы по тегам