如何创建一个同时具有全局和特定赋值的关系?



我的应用程序中有一个模型(我们可以称之为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

现在我希望能够创建任务,分配给所有代理一次与以下要求:

  1. "全局"任务分配给所有agent,但可以单独接受
  2. "全局"任务也适用于在全局任务创建后创建的代理。
  3. 我不想每次创建一个新的Agent(为了给他分配所有的全局任务)时都创建新的分配模型,也不想每次创建一个新的全局任务时都为所有现有的Agent创建分配。
  4. 分配给特定(或多个)代理的现有任务可以轻松转换为全局任务。
  5. 给定一个代理,我想在单个调用中获得他的所有分配(全局和特定),如果可能的话,作为关系而不是数组
在不为全局和非全局任务创建单独的表的情况下,实现此功能的良好设计(数据库和模型)将是什么?

谢谢!

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)

如果我的查询不适合你,或者如果你想走另一条路,总有其他的解决方案在线,和元哪里或挤压宝石可以帮助你。

最新更新