在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可以为你做这个,但这是你的电话。