从一个模型关联到另一个模型的重复活动记录

时间:2011-09-01 17:32:05

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

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

类别has_many任务 票务has_many任务 类别has_many门票 门票属于类别 任务belongs_to Ticket 任务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

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

2 个答案:

答案 0 :(得分:0)

如果您已将它们与该类别相关联,为什么还需要将它们与故障单关联?如果您需要绑定到故障单的粒度,那么只需使用该关联即可获取某个类别下的所有任务。将它们绑定到两者只会使网站变得复杂。现在,如果你绝对需要将它们绑定到两者,你应该为它创建一个赋值表,它存储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,它将执行所有正确的插入语句。

答案 1 :(得分:0)

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