【问题标题】:Duplicate activerecords associated from one model to another从一个模型关联到另一个模型的重复活动记录
【发布时间】:2011-09-01 17:32:05
【问题描述】:

所以我有一个 Task 模型、一个 Ticket 模型和一个 Category 模型。

类别 has_many 任务 工单 has_many 任务 类别 has_many 门票 门票属于_to 类别 任务belongs_to 工单 任务所属类别

当类别链接到工单时,与类别关联的任务是工单的默认任务。因此,当为工单选择类别时,我需要将与类别关联的任务复制并关联到工单。

我想知道我是否可以在我的 Ticket 模型中做这样的事情:

  after_create :duplicate_tasks_to_ticket
  after_update :duplicate_tasks_to_ticket

  def duplicate_tasks_to_ticket
    if self.tasks.blank?
      for task in self.category.tasks.all
        new_task = Task.new
        new_task.name = task.name
        new_task.ticket_id = self.id
        new_task.save
      end
    end
  end

现在这不会引发任何错误,但它不会做任何事情。任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 请问为什么new_task.save被注释掉了?
  • 如果您已经将它们与类别相关联,为什么还需要将它们与工单相关联?如果您需要与任务相关联的粒度,那么只需使用该关联来获取某个类别下的所有工单。将它们捆绑在一起只会使网站变得复杂。
  • 因为每次创建工单时,我都需要从类别中复制任务并将它们与工单相关联。基本上,该类别具有工单的默认任务。任务记录仅与工单或类别相关联,但不能同时与两者关联。
  • 哎呀,我在复制它之前不小心把它注释掉了。我在上面改了。我的代码中没有注释掉。

标签: ruby-on-rails ruby-on-rails-3 activerecord


【解决方案1】:

如果您已经将它们与类别相关联,为什么还需要将它们与工单相关联?如果您需要绑定到工单的粒度,那么只需使用该关联来获取某个类别下的所有任务。将它们绑定到两者只会使网站变得复杂。现在,如果您绝对需要将它们绑定到两者,您应该为此创建一个分配表,其中存储 category_id、task_id。 ticket_id 的另一个分配表 task_id。然后将任务保留为一个记录,就像复制数据一样。

您的代码大部分看起来都很好。我认为你最后不需要 .all 。关联将自动加载您在该模型下引用的所有内容。

尽管尝试使用关联构建方法:

def duplicate_tasks_to_ticket
  if self.tasks.blank?
    for task in self.category.tasks.all
      self.tasks.build(:name => task.name)
    end
    self.save
  end
end

构建创建该关联的新对象,为您分配外键。然后你只需在父模型上调用 save,它就会执行所有正确的插入语句。

【讨论】:

  • 效果很好,而且看起来更干净。我需要被复制,而不是与类别和票证绑定,因为每次创建与另一个票证具有相同类别的票证时,我不能有人需要能够检查它是否完整,这是任务的一个属性.否则,有人会检查任务是否已完成,并且该任务也可以完成分配给它的所有工单。谢谢你让它看起来更好。
  • 啊,好吧,因为我不知道细节,这对于您的特定用例可能更有意义。一件事,如果您想确保正确处理第二个对象的保存,可以包装一个 if 语句并在保存失败时执行某种日志记录或通知。另一种选择是使用保存!相反,如果模型存在验证问题,则会引发异常。非常欢迎你:)。
【解决方案2】:

实际上,当我尝试它时,我已经将它注释掉了,它现在正在工作。所以我想我想出的东西很好用。除非有人知道我如何改进它并使其更清洁。它现在正在工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 2018-07-10
    相关资源
    最近更新 更多