1

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

用户 (id, username, user_type, master_id) 项目 (id,itemname,is_master,master_id) 维修 (id, in_date, out_date, user_id, item_id)

该应用程序很小,因此我尝试使 db 尽可能简单。用户可以是管理员、经销商或经理。一个经理可以有许多经销商在他下面(都存储在同一个用户表中)。

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

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

我使用以下参数进行搜索( ALL 可选)

  • 经理姓名
  • 经销商名称
  • 主项目
  • 子项
  • 在日期
  • 过期日期

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

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

4

1 回答 1

1

Item.joins :repairs => :user

将为您完成从物品到维修到用户的连接。之后,只需在各个字段上按相等进行过滤(如果提供的话)。幸运的是,您可以在 Rails 中非常惯用地做到这一点,方法是构造您的搜索表单,使字段名称与它们在.where.

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

把它们放在一起,然后

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

如果您已经设置了关联助手(您绝对应该这样做),或者类似的东西可能会起作用。

于 2012-12-29T10:35:07.647 回答