我想这是一个架构查询。
我正在构建一个购物网站,当用户看到结果页面时,他们可以按价格,尺寸,品牌,商店等进行过滤。我这样做的方法是将过滤器发送到网址 - 这样可以正常工作。但是 -
我的控制器(实际上最近将这个逻辑移到模型中)有很多if else语句很疯狂。我目前的实施有:
######## different rhs scenarios ########
if params[:brand] and params[:store]
@products = Product.search_tank(params[:search], :per_page => @@pp, :page => params[:page], :category_filters => {:store => "#{params[:store]}", :brand => "#{params[:brand]}"})
elsif params[:store]
@products = Product.search_tank(params[:search], :per_page => @@pp, :page => params[:page], :category_filters => {:store => "#{params[:store]}"})
elsif params[:brand]
@products = Product.search_tank(params[:search], :per_page => @@pp, :page => params[:page], :category_filters => {:brand => "#{params[:brand]}"})
elsif params[:price]
@products = Product.search_tank(params[:search], :per_page => @@pp, :page => params[:page], :category_filters => {:price => "#{params[:price]}"})
else
@products = Product.search_tank(params[:search], :per_page => @@pp, :page => params[:page])
end
这基本上意味着我需要拥有所有组合:
1)搜索
2)搜索+价格
3)搜索+品牌
4)搜索+商店
5)搜索+大小
6)重复品牌/商店等!!
这可能不对,当然我不需要为每个可能的组合编程?我最近发现了params.merge,看起来至少在前端它可以帮助我。我有点像菜鸟,它让我觉得这可能是设计模式的用武之地。
有人能指出我正确的方向吗?
提前感谢您的所有帮助。
答案 0 :(得分:1)
新解决方案:
options = {}
options.merge!(:store => params[:store]) unless params[:store].blank?
options.merge!(:store => params[:price]) unless params[:price].blank?
options.merge!(:store => params[:brand]) unless params[:brand].blank?
@products = Product.search_tank(params[:search], :per_page => @@pp, :page => params[:page], :category_filters => options
答案 1 :(得分:0)
查看Ryan Bates关于“Refactoring& DynamicDelegator”的截屏视频。它会让你对清理这类东西有个好主意。 Refactoring & DynamicDelegator
答案 2 :(得分:0)
更好的模式可能涉及有选择地添加范围,看起来像这样:
products = Products.scoped
products = products.search(params[:q]) if params[:q]
products = products.store(params[:store]) if params[:store]
products = products.brand(params[:brand]) if params[:brand]