在Ruby on Rails中复制父记录和关联子记录的最佳方法?

可能重复:
ActiveRecord:如何克隆嵌套关联?

我有一张带invoices的桌子,而这些invoices又可以有很多items

现在,在我的invoices索引视图中,我想在每张invoice旁边放置一个链接,说明重复发票

如果没有子记录,这将非常简单:

  

但如果发票的items应该重复,怎么办呢?

作为一个Rails新手,我无法理解这一点。 所有这些都可以通过我的控制器内的new动作来处理吗?

 def new @invoice = current_user.invoices.build(:project_id => params[:project_id]) @title = "New invoice" end 

或者我是否需要在控制器内创建另一个名为copy函数?

什么是最佳做法?

谢谢你的任何意见……

逻辑应该放在模型中

invoice.rb

 def deep_dup new_invoice = Invoice.create(self.dup.attributes) items.each do |item| new_invoice.items.create(item.dup.attributes) end return new_invoice end 

然后在控制器中,执行一个名为duplicate的操作:

 def duplicate new_invoice = @invoice.deep_dup redirect to new_invoice end 

在你的创建动作中可能是这样的:

 def create @invoice = Invoice.new(params[:invoice] #find duplicate invoice (if exists) duplicate_invoice = Invoice.find(params[:duplicate_invoice_id]) unless duplicate_invoice.nil? items = nil duplicate_items = duplicate_invoice.items duplicate_items.each do |child| item = Item.new(child.attributes) item.save items << item end end if @invoice.save @invoice.items << items #add the duplicate items to the duplicate invoice #handle your redirects.... end end 

基本上你可以做的是将重复发票的id传递给你的创建操作,找到你想要复制的发票,然后将它的子项处理成一系列重复项。 最后一步是将新复制的项目添加到新复制的发票中。 这显然是未经测试的,而且需要一些额外的工作,但我希望你能得到这个想法的要点。 可能还有其他方法可以实现这一目标。

当然,也有gem可以为你做这个,但这是你的电话。