我目前在我的控制器中有以下内容:
@items = Item.scoped
@items = @items.where('price >= ?', params[:price_min]) if params[:price_min]
@items = @items.where('price <= ?', params[:price_max]) if params[:price_max]
@items = @items.where(:size => params[:size]) if params[:size]
@items = @items.where(:colour => params[:colour]) if params[:colour]
# ...
@items = @items.paginate(:page => params[:page], :per_page => 10)
这是这个代码的正确位置,还是它应该在控制器中通过单个方法调用真正属于我的模型?即。
@items = Item.apply_filters(params)
我尽可能地坚持惯例。
非常感谢。
答案 0 :(得分:2)
这是正确的,这一切都属于您的模型。这与我前几天审核的某人的代码非常相似。 MetaWhere gem也可能适合您的项目。
答案 1 :(得分:1)
此外,如果您的项目总是作为范围,您可以将其default_scope
。在你的模型中:
default_scope order("item_number"), where('price >= ?', 100)
(我不完全确定我的所有语法都是正确的,但它就是这样的。)
named_scope
也可能会帮助你。