我的应用程序中有一个模型(我们可以称之为Agent),它与模型Mission(表示可以分配给一个或多个代理的任务的模型)具有多对多关系 代理人可以接受任务:
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
现在,我希望能够根据以下要求创建分配给所有代理的任务:
如果不为全局和非全局任务创建单独的表,那么实现此功能的优秀设计(数据库和模型)会是什么?
谢谢!
爱丽儿
答案 0 :(得分:2)
我只想在任务中添加一个is_global标志。
然后,当您提取接受任务列表时,您只需查找已分配给特定代理并且尚未被接受的所有任务,以及未分配给特定代理的所有全局任务。 / p>
当代理接受全局任务时,创建分配记录并将接受设置为true。
如果代理人可以将他/她自己从任务中删除,那么只需销毁任务记录。
获取所有任务
您需要增强获取所有可用任务以查看两个不同的案例。第一种情况是分配的任务,第二种情况是全局但未分配的任务。
Mission.includes(:assignments)
.where("missions.is_global = true or assignments.agent_id = ?", agent_id)
我没有随时可以测试的红宝石环境,但如果这不正确则接近:)
<强>加成强>
如果作业是全局的或常规作业,您可以查询所有作业而无需关心。
assignments = agent.ssignments.where(accepted:true)
<强>更新强>
如果我的查询不适合您,或者您想要转到其他路线,则总会有其他在线解决方案,meta where或squeel宝石可以为您提供帮助。