如何创建具有全局和特定分配的关系?

时间:2013-03-19 22:01:54

标签: ruby-on-rails activerecord

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

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

  1. “全局”任务分配给所有代理,但可以单独接受
  2. “全球”任务也适用于在创建全球任务后创建的代理。
  3. 每次创建新代理时我都不想创建新的Assignment模型(为了分配他所有的全局任务)我不希望每次新的全局任务都为所有现有代理创建任务已创建。
  4. 分配给特定(或多个)座席的现有任务可以轻松转换为全球任务。
  5. 鉴于代理人,我希望在一次通话中获得所有作业(全局和特定),如果可能,作为关系而不是数组
  6. 如果不为全局和非全局任务创建单独的表,那么实现此功能的优秀设计(数据库和模型)会是什么?

    谢谢!

    爱丽儿

1 个答案:

答案 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 wheresqueel宝石可以为您提供帮助。