从一个模型到另一个模型关联的重复主动记录
问题描述:
所以我有一个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
眼下这不会引发任何错误,但它不会做任何事情。任何帮助将不胜感激。谢谢!
答
如果您已将它们关联到该类别,为什么它们还需要与该票证关联?如果您需要与票证绑定的粒度,那么只需使用该关联将所有任务归入某个类别。将它们绑在一起只会使网站变得复杂。现在,如果你绝对需要将它们绑定到两者,你应该为它创建一个赋值表,它存储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
构建创建关联的新对象,分配给你的外键。然后你只需调用保存在父模型上,它将执行所有正确的插入语句。
答
其实dexter我把它评论出来,当我尝试它,它现在工作。所以我想我的作品很好。除非有人知道我可以如何改进它并使之更加清洁。现在正在工作。
我可以问你为什么'new_task.save'被注释掉了吗? – dexter
如果您已经将它们与类别关联起来,为什么它们还需要与票证关联?如果您需要与任务绑定的粒度,那么只需使用该关联即可获取某个类别下的所有门票。将它们绑在一起只会使网站变得复杂。 – agmcleod
,因为每次创建故障单时,我都需要复制类别中的任务并将它们关联到故障单。基本上,该类别具有票证的默认任务。任务记录仅与票证或类别相关联,但不能同时与两者相关联。 – Marc