2011-12-18 2 views
0

Я бы хотел написать быстрый объем для фильтрации моих ресторанов.Оптимальная область для фильтра

я что-то вроде этого

@restaurants = Restaurant.all 
@restaurants = filter(@restaurants) 

def filter(restaurants) 
    restaurants = restaurants.filter('types', params[:type].split(','))   unless params[:type].nil? 
    restaurants = restaurants.filter('cuisines', params[:cuisine].split(',')) unless params[:cuisine].nil? 
    restaurants = restaurants.filter('facilities', params[:facility].split(',')) unless params[:facility].nil? 
    restaurants = restaurants.filter('services', params[:service].split(',')) unless params[:service].nil? 
    restaurants = restaurants.filter('prices', params[:price].split(','))  unless params[:price].nil? 
    return restaurants 
end 

где фильтр:

scope :filter, lambda{|type_name, type_id| includes(type_name.to_sym).where(["#{type_name}.id in (?)", type_id]) } 

так ... когда я получаю URL:

.../search?service=1,2,3 

я получаю рестораны с обслуживанием 1 ИЛИ 2 ИЛИ 3, но я хотел бы получить рестораны с услугами 1 И 2 ​​И 3. Как я могу сделать это как fas t, насколько это возможно?

ответ

1

IN in SQL is всегда будет OR операции. Сначала вам нужно разбить параметр, а затем сделать несколько фильтров. Кроме того, all уклоняется от ленивой загрузки AREL, поэтому сначала загружайте все, а затем отфильтровываете. Плохое mojo. :)

Вы считаете, что это маршрут?

# restaurant.rb 
scope :filter, lambda{|type_name, type_id| includes(type_name.to_sym).where("#{type_name}_id" => type_id) } 

# routes.rb 
match 'restaurants/search/*query', "restaurants_controller#search" 

# restaurants_controller.rb 
def search 
    query = params[:query] 
    query.delete_at(-1) if query.length % 2 > 0 #Otherwise we'll get an exception for providing an odd number of elements. 
    search_hash = Hash[*query].symbolize_keys 
    @restaurants = Restaurant.scoped 
search_hash.each do |key, value| 
    value.split(",").each do |v| 
     @restaurants.filter(key, v) 
    end 
    end 
end 

Тогда ваш поиск URL-адрес становится чем-то вроде:

/search/service/1,2,3/type/3,4,5 

Вы должны были бы сделать некоторую вменяемость проверки, как убедившись, что key этим свойства на Restaurant модели, но это должно работать. Кроме того, я исправляю это несколько раз, чтобы убедиться, что я ничего не пропустил, но это непроверенный код, который может иметь ошибки или опечатки. Пусть покупатель будет бдителен. :)

+0

Есть проблемы с delete_at (нет операции delete_at для String/service/1,2,3) и т. Д. :( –

+0

D'oh! In Rails 2 Я думаю, что он проходит как массив. Попробуйте разбить, чтобы получить массив компонентов пути. – jxpx777

Смежные вопросы