2011-12-22 21 views
1

私の候補モデルの高度な検索ファインダーを構築しようとしています。 これは、カップルのフィールドと複数の関連付けがhas_many: languages & has_many: skillsのように考えられます。今、私はこのようなクエリ構築しています:Railsの複数の関連付けの詳細検索

query = Candidate.select("*") 
if position_name 
    query = query.where('position_name LIKE ? OR position_name IS NULL',"%#{position_name}%") 
end 

if salary 
    query = query.where('salary <= ? OR salary IS NULL',salary) 
end 

をというように...

今私は、より高度な条件を追加したいだけでPHPJavaのような、そのようなスキルを持っているユーザー(そのリターンを見つけたいです両方のスキルを持っているユーザーのみ)

これは動作しますが、私はさらにOR

query = query.joins(:skills) 
    query = query.where('`skills`.`name` = ? OR `skills`.`name` = ?',"Java","PHP") 

を挿入した場合にのみ私は言語についても同じことを望みます(プラス、言語はlanguage.name & language.levelです)

誰かがどの方向に向いていますか?また、私は複数のスキルや複数の言語ができるような条件を構築する方法ですか?

+0

検索は急速に燃える。 – iwasrobbed

+0

私はこれを試してみます。ありがとう。 – Johny

答えて

3

は掻き回すとSearchlogicの両方が関連するモデルに検索できるようにし、検索を制限するためにスコープを使用することができます掻き回す、MetawhereまたはSearchlogicのようなさまざまな検索宝石を見

http://rubygems.org/gems/ransack

https://github.com/railsdog/searchlogic

を持っていますパラメーター。

例Searchlogicの検索パラメータ。

[search][admitted_gte] 

[search][admitted_lte] 

[search][aetiology_like_any][] VIRUS 

[search][at_risk_gte] 

[search][at_risk_lte] 

[search][died_gte] 

[search][died_lte] 

[search][gezi_reference_like] 

[search][id]  

[search][incidents_location_encrypted_postcode_like]  

[search][lab_confirmed_gte] 

[search][lab_confirmed_lte] 

[search][onset_first_after] 

[search][onset_first_before]  

[search][onset_last_after] 

[search][onset_last_before] 

[search][outbreak_type_equals_any][] FOODBORNE 

[search][point_source_date_after] 

[search][point_source_date_before] 

[search][total_affected_gte]  

[search][total_affected_lte]  

[search][user_reference_like] 

[search][year_equals_any][] 2010 

search[order] descend_by_id 

Outbreak_Controller.rb Indexアクションは、検索クエリの結果を返します。 17個の検索パラメータから1回だけsearchlogic呼び出しが必要です@search = Outbreak.search(params[:search])。 paramsは、許可されている検索パラメータのリスト(コードは表示されません)に対してホワイトリストに登録されています。それは些細なこの1のような作業を行い、もなりますので、あなたが真剣に[思考スフィンクス](http://freelancing-god.github.com/ts/en/)のような検索エンジンを使用して検討する必要があります

def index 

      #set the default index order to be descending Outbreak id 
      if !params[:search][:order] 
       params[:search][:order] = "descend_by_id" 
      end 
      if params[:search][:bacterial_agents_bacterium_name_like_any] != nil && !params[:search][:bacterial_agents_bacterium_name_like_any].empty? 
       params[:search][:bacterial_agents_category_like] = "CAUSATIVE" 
      end 
      if params[:search][:viral_agents_virus_name_like_any] != nil && !params[:search][:viral_agents_virus_name_like_any].empty? 
       params[:search][:viral_agents_category_like] = "CAUSATIVE" 
      end 
      if params[:search][:protozoal_agents_protozoa_name_like_any] != nil && !params[:search][:protozoal_agents_protozoa_name_like_any].empty? 
       params[:search][:protozoal_agents_category_like] = "CAUSATIVE" 
      end 
      if params[:search][:toxic_agents_toxin_name_like_any] != nil && !params[:search][:toxic_agents_toxin_name_like_any].empty? 
       params[:search][:toxic_agents_category_like] = "CAUSATIVE" 
      end 
    #Outbreak.search takes all of the given params and runs it against the Outbreak model and it's associated models 
    @search = Outbreak.search(params[:search]) 
end 
関連する問題