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. 给定一个代理,我想在一次调用中获得他的所有分配(全局和特定),如果可能的话,作为一个关系而不是一个数组

在不为全局和非全局任务创建单独的表的情况下实现此功能的良好设计(数据库和模型)是什么?

谢谢!

爱丽儿

4

1 回答 1

2

我只想在任务中添加一个 is_global 标志。

然后,当您获取要接受的任务列表时,您只需查找分配给特定代理但尚未接受的所有任务,以及未分配给特定代理的所有全局任务。

当代理接受全局任务时,创建分配记录并将接受设置为true。

如果特工可以将他/她自己从任务中移除,那么只需销毁任务记录。

获取所有任务

您将需要加强获取所有可用任务以查看两个不同的案例。第一种情况是已分配的任务,第二种情况是全局但未分配的任务。

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

我没有现成的 ruby​​ 环境可供测试,但如果不正确,它就很接近了:)

奖金

您可以查询所有分配,而无需关心分配是全局的还是常规的。

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

更新

如果我的查询对您不起作用,或者您想走另一条路线,那么在线总是有其他解决方案,而meta wheresqueel gems 可以帮助您。

于 2013-03-19T22:08:04.223 回答