2013-07-18 1 views
2

У меня есть класс для ресторанов и категорий, у которых есть отношения has_and_belong_to_many. Благодаря этой ассоциации я получаю метод restaurant.category_ids, который возвращает массив.Рельсы: запрос на основе метода не в таблице базы данных

Я хочу выбрать рестораны, которые относятся к указанным категориям (может быть более одного). Как создать этот запрос?

До сих пор у меня есть:

@restaurants = Restaurant.joins(:categories).where('categories.id' => params[:category_ids]) 

Но это возвращает дубликаты, а также рестораны, которые подходят только одна из категорий. .

Например, поиск американских, дешевы и ресторанов быстрого питания дает мне [ «Макдональдс», «Макдональдс», Макдональдс»,„Бургер Кинг“] для @restaurants

Я также попытался:

@restaurants = Restaurant.where(:category_ids => params[:category_ids]) 

Но category_ids не поле базы данных, и это не работает

Примечание:. PARAMS [: category_ids] представляет собой массив идентификаторов

Спасибо за любую помощь. !

+0

Вы пробовали IN. @restaurants = Restaurant.joins (: categories) .where ('categories.id IN (# {params [: category_ids]})') –

+0

@krishnasahoo Я хочу только рестораны, принадлежащие всем указанным категориям, а не только один из них. – user1411469

ответ

1

Я считаю, что единственным жизнеспособным решением будет генерировать запрос типа

Restaurant.joins(:categories).where('categories.id' => cat_id1).where('categories.id' => cat_id2)... 

, потому что тогда вы получите первый и где второй, где и ...

Чтобы получить записи только один раз вам нужно добавить .distinct

Так в целом решение было бы как (я не уверен, если это верно синтаксис)

query = Restaurant.joins(:categories) 
category_ids.each do |category_id| 
    query = query.where('categories.id' => category_id) 
end 
query.distinct 
+0

Это похоже на работу. Спасибо! – user1411469