Helpers - компьютеры, интернет, программирование

Поиск монгоидов по массиву идентификаторов ассоциаций

У меня есть проект Rails 4.2, Mongoid 4 с этими моделями:

class Customer #aka Company
  include Mongoid::Document

  has_many :branches
end

class Branch
  include Mongoid::Document  

  field :name, type: String, default: ""

  belongs_to :customer
end

Я хочу найти всех клиентов (также известных как компании), у которых есть филиал с названием «Нью-Йорк». Я думаю, что этот код будет работать:

branches = Branch.where(name: "New York").map(&:_id)
=> [BSON::ObjectId('54f76cef6272790316390100')]
Customer.where(:branch_ids => branches).entries

Однако он всегда возвращает пустой массив, независимо от того, что я пытаюсь сделать. Вместо branch_ids я также пробовал branches, branch, branches_id и другие, но безрезультатно. Я также пытался преобразовать BSON::ObjectID в обычный string, но это тоже не работает.

Итак, как я могу искать модель на основе массива идентификаторов ассоциаций? Спасибо.


  • Что он возвращает: Customer.elem_match(branches: { name: "New York" }) 11.03.2015
  • А это - Customer.where(:branches.elem_match => { name: "New York" }) 11.03.2015
  • @SharvyAhmed Оба возвращают пустой массив (после вызова .entries) 11.03.2015
  • не могли бы вы попробовать без .entries, попробуйте .to_a в конце и сообщите нам результат 11.03.2015
  • Возвращает ли он всех клиентов? 11.03.2015
  • С .to_a он по-прежнему возвращает пустой массив. Без .entries или .to_a он возвращает действительное Mongoid::Criteria, но само по себе это мне не помогает. 11.03.2015
  • Вы пробовали это, чтобы получить идентификаторы веток branches = Branch.where(name: "New York").map { |b| b.id.to_s }? Тогда Customer.where(branch_id: branches).entries ? branch_id будет именем поля, а не branch_ids. 11.03.2015
  • Да, то же самое с BSON::ObjectID или без него. 11.03.2015
  • Давайте продолжим обсуждение в чате. 11.03.2015
  • у вас все еще есть желание сделать это эффективным способом? 11.03.2015

Ответы:


1

Если отношения

Клиент has_many :branches и

Филиал belongs_to :customer,

Тогда коллекция ветвей будет иметь столбец customer_id, а не наоборот. Так что вы можете сделать

cust_ids = Branch.where(name: "New York").map(&:customer_id)
Customer.find(cust_ids)

Поскольку вам нужны только идентификаторы клиентов из первого запроса, рекомендуется использовать pluck

cust_ids = Branch.where(name: "New York").pluck(:customer_id)
11.03.2015
  • Это работает (не знаю, почему я об этом не подумал), но похоже на обходной путь. Я знаю, что нет столбца branch_ids, но есть метод. Я просто не знаю, можете ли вы искать с помощью метода. 11.03.2015

  • 2

    Вы можете использовать Symbol#elem_match следующим образом:

    Customer.where(:branches.elem_match => { name: "New York" })
    

    И Queryable#elem_match вот так:

    Customer.elem_match(branches: { name: "New York" })
    

    Оба запроса вернут вам клиентов филиалов «Нью-Йорк».

    11.03.2015
    Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..