2012-12-29 59 views
1

我有以下模式的Rails應用程序:搜索數據庫中的導軌和多個可選參數

用戶(ID,用戶名,USER_TYPE,master_id) 項目(ID,ITEMNAME,is_master,master_id) 維修(ID, in_date,out_date,user_id,item_id)

該應用程序很小,所以我嘗試讓db儘可能簡單。用戶可以是管理員,經銷商或經理。經理可以有許多經銷商(都存儲在同一個用戶表中)。

一個物品可以是一個像電腦一樣的主物品(有許多子物品,如鍵盤,鼠標),也可以只是一個小的子物品。主項目下可以有許多子項目。

修復是項目的修復歷史記錄。修復有一個項目和用戶關聯。

我有一個搜索具有以下參數(所有可選)

  • 經理姓名
  • 經銷商名稱
  • 碩士項目
  • 子項目
  • 日期
  • 已過期

如果未指定經銷商名稱我希望結果指定經理中的所有經銷商,如果未指定子項目我希望主項目下的所有項目都在結果中。

如何定義搜索控制器以保持代碼的簡單性和可維護性?我真的不想爲每個條件做一個'如果'。

+0

如果我很好地理解了這個意圖(而且很有可能我沒有,因爲問題有點模糊),您希望能夠在任何指定的字段上以相等的方式搜索項目,其中一些是其他桌子上的列? – tehgeekmeister

回答

1

Item.joins :repairs => :user

將執行從項目修復加盟爲該用戶。之後,如果提供的話,這只是在各個領域平等過濾的問題。幸運的是,您可以通過構建您的搜索表單來非常方便地在軌道中執行此操作,以使字段名稱匹配它們在散列表中的內容.where

根據視圖的結構,您需要過濾掉所有空白參數(空或空)。 params.reject {|k,v| v.blank?}應該爲你做。

全部放在一起,然後

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

或者相近的,可能做的伎倆,如果你已經建立了關聯助手(你絕對應該)。

+0

問題是我的數據庫表太簡單了,經理和經銷商之間的關聯has_many,主項目和子項目沒有定義。我必須根據用戶和項目的ID手動查找結果。(例如,如果僅指定經理,我首先需要根據經理的身份查看經理下的所有經銷商,然後查看修理表,對於類似經銷商的MasterItem和SubItems也是如此) –

+0

刪除以前的評論... 看來你可以做一個嵌套連接,而不是,如果你使用關聯。 – tehgeekmeister

+0

更新了我的回覆,以反映我更好的理解。讓我知道它是否不能解決問題。 – tehgeekmeister