[英]Auto-assigning objects to users based on priority in Postgres/Ruby on Rails
我正在構建用於管理工作項目隊列的Rails應用程序。 我有幾種類型的用戶(“訪問級別”)要自動分配這些工作項。
最終目標是我的其中一個視圖上的“自動分配”按鈕,該按鈕將根據優先級自動獲取下一個工作項,該優先級由用戶的訪問級別定義。
我試圖在work_item模型中設置一個類方法,以根據用戶的訪問級別按類型自動對工作項進行排序。 我正在看這樣的東西:
def self.auto_assign_next(access_level)
case
when access_level = 2
where("completed = 'f'").order("requested_time ASC").limit(1)
when access_level > 2
where("completed = 'f'").order("CASE WHEN form='supervisor' THEN 1 WHEN form='installer' THEN 2 WHEN form='repair' THEN 3 WHEN form='mail' THEN 4 WHEN form='hp' THEN 5 ELSE 6 END").limit(1)
end
不過,這不是很干。 理想情況下,我希望排序順序可由管理員配置,因此最好設置一個單獨的表以保留排序順序。 該想法的問題在於我不知道如何將該表上的優先級順序傳遞給SQLSQL查詢。 我對SQL一般是陌生的,對此有些迷茫。 有人對如何處理有任何建議嗎?
一種相當簡單的方法開始於將您的case語句轉換為一個新表,列出form
值與應按其排序的precedence
值:
id | form | precedence
-----------------------------------
1 | supervisor | 1
2 | installer | 2
(etc)
為此創建一個模型,例如FormPrecedences
(不是一個好名字,但是我並不完全依賴您的數據模型,因此選擇一個更好地描述它的模型)。 然后,您的查詢如下所示( 注意:我假設您當前的模型稱為WorkItems ):
when access_level > 2
joins("LEFT JOIN form_precedences ON form_precedences.form = work_items.form")
.where("completed = 'f'")
.order("COALESCE(form_precedences.precedence, 6)")
.limit(1)
它的工作方式並不像看起來那樣復雜。 SQL中的“左連接”僅獲取左側表的所有行(在本例中為work_items
),並為每一行從右側表中查找所有匹配的行( form_precedences
,其中“ matching”為由“ ON”關鍵字form_precedences.form = work_items.form
的位定義: form_precedences.form = work_items.form
),並發出一個合並的行。 如果未找到匹配項,則LEFT JOIN
仍將發出一行,但所有右側值為NULL。 普通聯接將跳過未找到右側匹配項的任何行。
無論如何,將優先級數據加入到我們的工作項中后,我們可以按優先級值進行排序。 但是,如果在上述連接期間未找到匹配項,則該值將為NULL,因此,我使用COALESCE
(它返回其第一個非NULL參數)默認為優先級6
。
希望有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.