2013-03-05 83 views
1

我有一个“Projects”的基本模型,它目前只有属性name:string,active:boolean。在索引视图中,我希望能够有三个链接:活动项目,非活动项目和所有项目。这些链接将根据活动布尔值的状态显示适当的项目。起初,我成立了看法给予链接PARAMS,如:Rails:排序和筛选基于布尔属性的数据

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 

这似乎有点麻烦,尤其是在未来,我希望有多个过滤器,像到期日和客户。实现高级排序/筛选操作的好方法/宝石是什么,而不是用很多代码填充控制器?

+1

https://github.com/ern即/ ransack是一个伟大的过滤宝石。 – deefour 2013-03-05 16:19:09

回答

1

你可以构建你的参数作为散列,并将其传递给条件:

# example: 
params = { 
    :filters => { 
    :active => true, 
    :name => 'Boby', 
    # etc... 
    } 
} 

filters = params[:filters] 
@projects = Project.where(filters) 
+0

这看起来不错。谢谢。 – dremme 2013-03-05 16:31:34

0

我会建议使用where语句。也这是你的代码重构:

@projects = Project.all 
@projects = @projects.where(active: params[:active]) if params[:active].present? 

然后你就可以保持堆放物品上是否存在像这样的附加PARAMS:

@projects = @projects.where(awesome_sauce: params[:awesome_sauce]) if params[:awesome_sauce].present?