我的应用程序中有一个模型(我们可以称之为Agent),它与模型Mission(一个代表任务的模型,可以分配给一个或多个代理)具有多对多关系。一个任务可以被agent接受:
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
现在我希望能够创建任务,分配给所有代理一次与以下要求:
- "全局"任务分配给所有agent,但可以单独接受
- "全局"任务也适用于在全局任务创建后创建的代理。
- 我不想每次创建一个新的Agent(为了给他分配所有的全局任务)时都创建新的分配模型,也不想每次创建一个新的全局任务时都为所有现有的Agent创建分配。
- 分配给特定(或多个)代理的现有任务可以轻松转换为全局任务。
- 给定一个代理,我想在单个调用中获得他的所有分配(全局和特定),如果可能的话,作为关系而不是数组
谢谢!
Ariel
我只想给Mission添加一个is_global标志。
然后,当你获取任务列表接受时,你只需查找所有分配给特定代理但尚未被接受的任务,以及所有未分配给特定代理的全局任务。
当座席接受全局任务时,创建分配记录,并将accept设置为true。
如果一个特工可以把自己从任务中移除,那么就销毁任务记录。
获取所有任务
你需要增强获取所有可用任务的功能,以查看两种不同的情况。第一种情况是分配的任务,第二种情况是全局但未分配的任务。
Mission.includes(:assignments)
.where("missions.is_global = true or assignments.agent_id = ?", agent_id)
我没有现成的ruby环境来测试,但如果这是不正确的,它接近:)
你可以查询所有的赋值,而不用关心赋值是全局的还是常规的。
assignments = agent.ssignments.where(accepted:true)
如果我的查询不适合你,或者如果你想走另一条路,总有其他的解决方案在线,和元哪里或挤压宝石可以帮助你。