我有一个“Projects”的基本模型,它目前只有属性name:string,active:boolean。在索引视图中,我希望能够有三个链接:活动项目,非活动项目和所有项目。这些链接将根据:active boolean值的状态显示相应的项目。最初我通过给出链接参数来设置视图:
link_to "Active Projects", {:action => 'index', :active => true}
然后在控制器中:
if params[:active] == "true"
@projects = Project.find(:all, :conditions => {:active => true})
elsif params[:active] == "false"
@projects = Project.find(:all, :conditions => {:active => false})
else
@projects = Project.all
这看起来有点麻烦,特别是因为将来我想拥有多个过滤器,比如截止日期和客户端。实现高级排序/过滤操作的好方法/ gem是什么,而不需要用大量代码填充控制器?
答案 0 :(得分:1)
您可以将params构造为哈希,并将其传递给条件:
# example:
params = {
:filters => {
:active => true,
:name => 'Boby',
# etc...
}
}
filters = params[:filters]
@projects = Project.where(filters)
答案 1 :(得分:0)
我建议使用where
语句。这里还有你的代码重构:
@projects = Project.all
@projects = @projects.where(active: params[:active]) if params[:active].present?
然后,如果存在类似的附加参数,则可以继续堆叠项目:
@projects = @projects.where(awesome_sauce: params[:awesome_sauce]) if params[:awesome_sauce].present?