使用多个可选参数在Rails中搜索数据库

时间:2012-12-29 09:56:20

标签: ruby-on-rails ruby database ruby-on-rails-3

我有一个带有以下架构的Rails应用程序:

用户(id,username,user_type,master_id) Item(id,itemname,is_master,master_id) 修复(id,in_date,out_date,user_id,item_id)

该应用程序很小,所以我尽量保持数据库尽可能简单。用户可以是管理员,经销商或经理。经理可以在他下面有许多经销商(两者都存储在同一个用户表中)。

项目可以是像计算机这样的主项目(有许多子项目,如键盘,鼠标),也可以只是一个小的子项目。主项目下可以包含许多子项目。

修复是项目的修复历史记录。修复有一个项目和用户关联。

我搜索了以下参数(ALl可选)

  • 经理姓名
  • 经销商名称
  • 主要项目
  • 子项目
  • 日期
  • 外出日期

如果没有指定经销商名称,我希望结果指定经理中的所有经销商,如果没有指定子项目,我希望主要项目下的所有项目都在结果中。

如何定义搜索控制器以保持代码简单和可维护?我真的不想为每个条件做一个'if'。

1 个答案:

答案 0 :(得分:1)

Item.joins :repairs => :user

将从项目到用户的修复加入。在那之后,如果提供它们,只需要在各个字段上通过平等​​过滤。幸运的是,您可以通过构建搜索表单来非常惯用地在rails中执行此操作,以使字段名称与.where的哈希值相匹配。

您需要过滤掉所有空白参数(空或零),具体取决于视图的结构。 params.reject {|k,v| v.blank?}应该为你做到这一点。

全部放在一起,然后

Item.joins(:repairs => :user).where(params.reject {|k,v| v.blank?})

如果你已经设置了关联助手(你绝对应该这样做),那么

或接近这个的东西可能会成功。