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

问题描述:

所以我有一个Task模型,一个票据模型和一个Category模型。从一个模型到另一个模型关联的重复主动记录

类别的has_many任务 票的has_many任务 类别的has_many门票 票务belongs_to的范畴 任务belongs_to的票务 任务belongs_to的范畴

了关联到一个类别是一票的默认任务时,一类是任务链接到一张票。因此,当为票证选择类别时,我需要将与类别关联的任务复制并关联到票证。

我想知道如果我可以做这样的事情在我的票务模式:

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 

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

+0

我可以问你为什么'new_task.save'被注释掉了吗? – dexter

+0

如果您已经将它们与类别关联起来,为什么它们还需要与票证关联?如果您需要与任务绑定的粒度,那么只需使用该关联即可获取某个类别下的所有门票。将它们绑在一起只会使网站变得复杂。 – agmcleod

+0

,因为每次创建故障单时,我都需要复制类别中的任务并将它们关联到故障单。基本上,该类别具有票证的默认任务。任务记录仅与票证或类别相关联,但不能同时与两者相关联。 – Marc

如果您已将它们关联到该类别,为什么它们还需要与该票证关联?如果您需要与票证绑定的粒度,那么只需使用该关联将所有任务归入某个类别。将它们绑在一起只会使网站变得复杂。现在,如果你绝对需要将它们绑定到两者,你应该为它创建一个赋值表,它存储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 

构建创建关联的新对象,分配给你的外键。然后你只需调用保存在父模型上,它将执行所有正确的插入语句。

+0

工作得很好,看起来更清洁。我需要被复制,而不是绑定到类别和票据上,因为每次使用与另一张票据相同的类别创建票证时,我不能让某人需要将其检查为完成,这是任务的属性。否则,有人会检查任务是否完成,并且任务也可以为所分配的所有票证完成。感谢让它看起来更好。 – Marc

+0

好的,因为我不知道细节,这对您的特定用例可能更有意义。有一件事,如果你想确保你正确地处理第二个对象的保存,可能会包装一个if语句并在保存失败时执行某种记录或通知。另一种选择是使用保存!相反,如果模型存在验证问题,则会引发异常。而且你非常欢迎:)。 – agmcleod

其实dexter我把它评论出来,当我尝试它,它现在工作。所以我想我的作品很好。除非有人知道我可以如何改进它并使之更加清洁。现在正在工作。