2015-03-11 2 views
1

У меня есть Rails 4.2, Mongoid 4 проекта с этими моделями:Mongoid Поиск по Массива Ассоциации идентификаторам

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, но это тоже не работает.

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

+0

Что он возвращает: 'Customer.elem_match (ветки: {name:" New York "})' –

+0

И это - 'Customer.where (: branches.elem_match => {name:" New York "})' –

+0

@SharvyAhmed Оба возвращают пустой массив (после вызова '.entries') –

ответ

1

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

клиентов has_many :branches и

Отделение belongs_to :customer,

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

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

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

cust_ids = Branch.where(name: "New York").pluck(:customer_id) 
+0

Это работает (не знаю, почему я об этом не думал), но это похоже на обходной путь. Я знаю, что нет столбца 'branch_ids', но есть метод. Я просто не знаю, можете ли вы искать метод. –

0

Вы можете использовать Symbol#elem_match как это:

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

И Queryable#elem_match вот так:

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

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