我有一个带有以下架构的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'。
答案 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?})
或接近这个的东西可能会成功。