我有一个控制器,它有很多选项通过表格发送给它,我想知道如何最好地将它们分开,因为它们并非全部同时使用。即有时不,标签,有时没有指定价格。对于价格,我有一个默认价格设置,所以我可以解决它总是在那里,但标签要么需要在那里,或不。等
@locations = Location.find(params[:id])
@location = @locations.places.active.where("cache_price BETWEEN ? AND ?",price_low,price_high).tagged_with([params[:tags]).order(params[:sort]).paginate :page => params[:page]
我没有看到任何这方面的好例子,但我确信它必须经常发生......有什么建议吗?此外,即使是最后添加的will_paginate也应该是可选的,因为结果会转到列表或谷歌地图,而且地图不需要分页。
答案 0 :(得分:4)
重构复杂搜索操作时要做的第一件事就是使用匿名范围。
即:
fruits = Fruit.scoped
fruits = fruits.where(:colour => 'red') if options[:red_only]
fruits = fruits.where(:size => 'big') if options[:big_only]
fruits = fruits.limit(10) if options[:only_first]
...
如果操作控制器仍然太大,您可以使用类来处理搜索。此外,通过使用Rails 3和ActiveModel类,您还可以使用验证...
看看我的一个插件:http://github.com/novagile/basic_active_model,它允许您轻松创建可在表单中使用的类。
另请参阅http://github.com/novagile/scoped-search另一个更专业的插件,使用模型的范围来创建搜索对象。