2017-11-28 6 views
1

いくつかの属性を持つRuby on RailsアプリケーションにOrderモデルがあります。 itemCount、totalPrice、created dateなどのユーザが指定したパラメータに従ってこれらの注文を照会したいと思います。Ruby、動的にクエリモデル

これらの属性のいずれかが指定されていれば、それはゼロではないことを意味します。私はそれを使用してモデルをクエリする必要があります。

私のような何かを行うことができます。しかし、私はそれについて確認することはできません

if params[:totalPrice] and params[:itemCount] and params[:created_date] 
    @product = Product.where(totalPrice: params[:totalPrice],itemCount: params[:itemCount],created_date: params[:created_date]) 
elsif params[:totalPrice] and params[:itemCount] 
    @product = Product.where(totalPrice: params[:totalPrice],itemCount: params[:itemCount]) 
elsif params[:totalPrice] and params[:created_date] 
    @product = Product.where(totalPrice: params[:totalPrice],created_date: params[:created_date]) 
elsif params[:itemCount] and params[:created_date] 
    @product = Product.where(itemCount: params[:itemCount],created_date: params[:created_date]) 
elseif ....(and continues) 

。多分、その問題を達成するための "Ruby"の方法があります。

これを行うベストプラクティスは、

ありがとうございます。

+0

そうでないかもしれない正確な複製が、IMO十分に近いです。 –

答えて

4

あなたがチェーンのActiveRecordと異なるスコープすることができます:

@products = Product.all 
@products = @products.where(totalPrice: params[:totalPrice]) if params[:totalPrice] 
@products = @products.where(itemCount: params[:itemCount]) if params[:itemCount] 
@products = @products.where(created_date: params[:created_date]) if params[:created_date] 
# etc... 

をそして、これは簡単に動的な(しかし、ホワイトリストされている)ことができます。

filterable_columns = %i(itemCount totalPrice created_date) 
@products = Product.all 
filterable_columns.each do |column| 
    @products = @products.where(column => params[column]) if params[column] 
end 
+0

少なくとも私のif-else解決策によれば、それは素晴らしいようです。あなたのチェーンベースのソリューションに喜んでページネートの宝石を使用できますか? –

+0

はい、ActiveRecord :: Relation(基本的に 'where'呼び出しによって返されます)では、モデル内で定義された複数の' scope'sを呼び出すか、独自のカスタム 'where'を呼び出すことで連鎖スコープを行うことができます)。私が正しく思い出すなら、AR :: Relationか配列のいずれかで動作します。 – MrYoshiji

関連する問題