簡體   English   中英

根據Postgres / Ruby on Rails中的優先級將對象自動分配給用戶

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM