1

我有一个“项目”的基本模型,目前只有属性名称:字符串,活动:布尔。在索引视图上,我希望能够拥有三个链接:活动项目、非活动项目和所有项目。这些链接将根据 :active 布尔值的状态显示相应的项目。最初,我通过提供如下链接参数来设置视图:

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,而不用大量代码填充控制器?

4

2 回答 2

1

您可以将参数构造为哈希,并将其传递给条件:

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

filters = params[:filters]
@projects = Project.where(filters)
于 2013-03-05T16:25:49.460 回答
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?
于 2013-03-05T16:24:14.357 回答