2017-08-16 13 views
3

登録済みの投票者で満たされたPGデータベースを使用します。ActiveRecord(SQL)は、検索文字列が空でない場合にのみ複数の列を照会します。

私は姓、姓、郵便番号または都市で検索できるように設定しようとしています。入力されたすべてのパラメータに一致するすべての有権者を見つけることができるようにしたいが、空の検索フィールドを扱うのには問題がある。

where("zip LIKE ? OR city LIKE ? OR last_name LIKE ? OR first_name LIKE ?", 
"#{params[:zip]}","#{params[:city]}","#{params[:last_name]}","#{params[:first_name]}") 

それがすべて入力されたパラメータと一致しますが、空の文字列パラメータを無視するようにそれを構築するための良い方法はありますか?今私が名字「John Smith」を入力すると、「John Jones」と「Jane Smith」が手に入ります。

答えて

3

これはトリックを行うことができます:

attrs_name_to_search = %w(zip city last_name first_name) 
fitlered_params = params.slice(*attrs_name_to_search).select { |_,v| v.present? } 
sql_cond = filtered_params.map { |k,_| "#{k} LIKE :#{k}" }.join(' OR ') 
YourModel.where(sql_cond, filtered_params) 

をしかし、誰郵便番号/都市/ LAST_NAME/FIRST_NAMEが指定されていない場合には、すべてのレコードを返す必要があります。

+0

ありがとう、これは、paramsから入ってくる空の文字列をフィルタリングします。私がしなければならなかった唯一の調整は、参加する言葉が私の目的のためにANDでなければならないということでした。私の元の質問ではっきりしていないかもしれません。 また、ActiveRecordのパラメータは独自のマップ可能ではないので、強力なパラメータを渡し、次にto_h 'params.permit(:something).to_h'を渡す必要があります –

関連する問題