2011-12-18 15 views
0

私のレストランをすばやく絞り込むためのスコープを書きたいと思います。フィルタの最適範囲

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とレストランを取得したり、

私はフィルタがあり、この

@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 

ような何かを行います2 OR 3ですが、サービス1と2と3があるレストランをご希望です。 どうすればいいですか?それは可能ですか?

答えて

1

INは、です。は、ORの操作になります。まずパラメータを分割してから、複数のフィルタを実行する必要があります。また、allは、ARELの遅延読み込みを回避して、すべてを最初にロードしてからそこからフィルタリングしています。悪いモジョ。 :)

これをルートとみなしましたか?あなたはkeyを確認することのようにチェックするいくつかの正気を行う必要があると思います

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

Restaurantモデルのプロパティであるが、これは動作するはずです:

# 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は次のようなものになります。また、何度もこれを校正して、何も見逃していないことを確認しましたが、これはバグやタイプミスの可能性があるテストされていないコードです。買い手責任負担。 :)

+0

文字列/サービス/ 1,2,3などでdelete_at(string/service/1,2,3の操作はdelete_at)に問題があります: –

+0

D'oh!Rails 2では配列として渡すと思います。パス構成要素の – jxpx777

関連する問題