Rails:基于布尔属性对数据进行排序和过滤

时间:2013-03-05 16:02:45

标签: ruby-on-rails ruby-on-rails-3.2

我有一个“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是什么,而不需要用大量代码填充控制器?

2 个答案:

答案 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?