2017-03-21 3 views
1

Rails 4とMySQLの使用。私は以下を持っています:paramsが存在するかどうかに依存するRailsのSQLクエリ

if params[:a].present? && params[:b].present? && params[:c].present? 
    Shop.where("a = ? AND b = ? AND c = ?", params[:a], params[:b], params[:c]) 
elsif params[:a].present? && params[:b].present? 
    Shop.where("a = ? AND b = ?", params[:a], params[:b]) 
elsif params[:a].present? 
    Shop.where("a = ?", params[:a]) 
else 
    Shop.where("z = ?"), params[:z]) 
end 

これは醜いので、これは単に理想的ではありません。より良いアプローチがありますか?

答えて

0

コントローラーコード:

if params[:a].present?|| params[:b].present? || params[:c].present? 
    Shop.custom_search(request.POST) 
else 
    Shop.where("z = ?", params[:z]) 
end 

モデルコード:私はacが存在しているのparams場合と仮定してい

def self.custom_search(params_hash) 
    where(params_hash.slice("a", "b", "c")) 
    end 

、あなたはacを返すようにしたいと思います。あなたが本質的にしているのは、いずれかのパラメータが存在する場合はrequest.POSTを介してPOST変数を取得し、それをモデルコードにあるカスタム検索アルゴリズムに入れます。

そこから、取得したい特定のキーと値のペアの引数としてキーを入れて、paramsハッシュをスライスします。あなたはしたくなかった場合は、具体的paramsハッシュキーか、両方持っているかどうかにチェックkey?方法で、あなただけのunless声明の中でどこを包むことができるすべてで何かを返すようにparams[:a]params[:c]をしたくなかった

unless params_hash.key?("a") && params_hash.key?("c") 
    where(params_hash.slice("a", "b", "c")) 
end 
関連する問題