2017-06-07 7 views
1

これは機能していますが、具体的な方法があると思いました。ActiveRecordクエリインターフェイスを保持するためのよりクリーンな方法はありますか?

@deals = Deal.where("1=1") 
    if @dealFilter.min.to_i > 0 
    @deals = @deals.where("size >= ?", @dealFilter.min) 
    end 
    if ... 

私はDeal.selectを試しましたが、パラメータが必要です。私はDeal.noneを見つけたが、それは常に何も返さない。私はDeal.whereを試しましたが、別のwhereをチェーンしようとするとundefined method ``where' for #<ActiveRecord::QueryMethods::WhereChain:0x0000001d2bfb20>となりました。

私は多くの条件をまとめています。一致する条件がない場合は、Deal.allを返します。

参考:http://guides.rubyonrails.org/active_record_querying.html

答えて

1

あなたはActiveRecordのスコープを利用すると、お使いのモデルにロジックを移動することができます。たとえば、次のように

class Deal < ActiveRecord::Base 

    scope :filter_min, ->(min) { 
    where("size >= ?", min) if min.to_i > 0 
    } 
    scope :filter_max, ->(max) { 
    where("size <= ?", max) if max.to_i > 0 
    } 

end 

そして、あなたのコントローラで次のように記述することができます:

Deal.filter_min(@dealFilter.min).filter_max(@dealFilter.max) 
関連する問題