2013-03-19 61 views
0

我的應用程序中有一個模型(我們可以稱之爲代理),它與模型任務(代表可以分配給一個或多個代理的任務的模型)具有多對多關係 任務可以接受由代理人:如何創建具有全局和特定作業的關係?

class Agent < ActiveRecord::Base 
    has_many :assignments 
    has_many :missions, :through => :assignments 
end 

class Assignment < ActiveRecord::Base 
    belongs_to :agent 
    belongs_to :mission 

    attr_accessible :accepted 
end 

class Mission < ActiveRecord::Base 
    has_many :assignments 
    has_many :agents, :through => :assignments 
end 

現在我希望能夠創建一個分配給所有代理商同時符合下列要求的任務:

  1. 「全球性」的任務被分配給各代理商,但可以單獨接受
  2. 「全球」特派團也適用於全球特派團創建後創建的特工。
  3. 我不想在每次創建新代理時創建新的分配模型(爲了將其分配給所有全球任務),並且我不想爲每次新的全球任務創建所有現有代理的分配被建造。
  4. 分配給特定(或多個)代理商的現有任務可輕鬆轉換爲全球任務。
  5. 給定一個代理,我希望得到他的全部任務(全局和專用)在一個單一的呼叫,如果可能的話,作爲一個關係,而不是一個數組

這將是一個不錯的設計(包括數據庫和模型)來實現此功能,而無需爲全球和非全球任務創建單獨的表格?

謝謝!

Ariel

回答

2

我只是給任務添加一個is_global標誌。

然後,當您提取任務列表以接受您時,只需查找具有指定給特定坐席且未被接受的所有任務,以及未分配給特定坐席的所有全球任務。

當代理接受全球任務時,創建分配記錄並將接受設置爲true。

如果一個特工可以從任務中刪除他/她自己,那麼只需銷燬任務記錄即可。

抓取所有任務

您將需要提高獲取所有可用的任務來看看兩種不同的情況。第一種情況是分配的任務,第二種情況是全球但未分配的任務。

Mission.includes(:assignments) 
     .where("missions.is_global = true or assignments.agent_id = ?", agent_id) 

我沒有紅寶石ENV現成的測試,但如果這是不正確的已經很接近了:)

獎金

您可以爲所有任務查詢,而如果分配關懷是全球性的或正規的。

assignments = agent.ssignments.where(accepted:true) 

更新

如果我查詢不適合你,或者如果你想要去的另一條路線總有其他的解決方案的在線和meta wheresqueel寶石可以幫助你。

+0

這是相當複雜的(實際上是我目前的解決方案,對不起,我沒有提到它)。這意味着我無法通過任何關係獲得我所有的任務(任務只有全球任務被接受,但它將具有所有特定的任務)。此外,執行agent1.assignments或agent1.missions將返回不一致的結果(對於非全局但是被全球化的任務以及被接受的全球任務) – Sakin 2013-03-19 22:14:43

+1

您必須修改查詢以包含全局未分配任務。我會更新我的答案。 – awbergs 2013-03-19 22:16:17

相關問題