2013-03-19 2 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. A "글로벌"의 임무는 모든 에이전트에 할당됩니다, 각 개별적으로 받아 들일 수 있음
  2. "global" 임무는 글로벌 임무를 만든 후에 만들어진 에이전트에도 적용됩니다.
  3. 새로운 에이전트가 생성 될 때마다 (모든 글로벌 임무를 할당하기 위해) 새 할당 모델을 생성하고 싶지 않고 새로운 글로벌 임무가있을 때마다 기존 에이전트에 대한 할당을 만들고 싶지 않습니다. 만들어집니다.
  4. 특정 (또는 여러 개의) 에이전트에 할당 된 기존 임무는 글로벌 임무로 쉽게 전환 될 수 있습니다. 에이전트 감안할 때
  5. , 나는, (글로벌 및 특정) 단일 통화에서 가능하다면 그의 모든 과제를 얻으려면 관계가 아닌 배열로

(좋은 디자인이 될 것입니다 무엇 모두 DB 및 모델) 글로벌 및 비전업 임무를위한 별도의 테이블을 만들지 않고도이 기능을 구현할 수 있습니까?

감사합니다.

아리엘은

답변

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 where 또는 squeel 보석이 당신을 도울 수 있다면.

+0

이것은 매우 복잡합니다 (사실은 현재의 해결책입니다. 미안하지만, 제가 언급하지 않았습니다). 모든 관계를 통해 모든 임무를 수행 할 수 없다는 것을 의미합니다 (과제는 받아 들여지는 글로벌 임무 만 갖지만 특정 임무를 모두 갖게됩니다). 또한 agent1.assignments 또는 agent1.missions를 수행하면 일치하지 않는 결과가 반환됩니다 (전역이 아니지만 글로벌로 작성된 임무 및 허용 된 글로벌 임무의 경우) – Sakin

+1

전역 할당되지 않은 임무를 포함하도록 쿼리를 수정해야합니다 선교. 나는 나의 대답을 업데이트 할 것이다. – awbergs

관련 문제