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

时间:2012-11-02 19:05:18

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

  

可能重复:
  ActiveRecord: How can I clone nested associations?

我有一张invoices的表格,而这张表格可以有很多items

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

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

<%= link_to "Duplicate", new_invoice_path(invoice.attributes) %>

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

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

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

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

最佳做法是什么?

感谢您的任何意见......

2 个答案:

答案 0 :(得分:6)

逻辑应该放在模型中

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

答案 1 :(得分:0)

在你的创作中也许是这样的事情:

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传递给您的创建操作,找到您打算复制的发票,然后将其子项目处理为一系列重复项目。最后一步是将新复制的项目添加到新复制的发票中。这显然是未经测试的,并且需要一些额外的工作,但我希望你能得到这个想法的要点。可能还有其他方法可以实现这一目标。

当然,也有宝石可以为你做这件事,但这是你的召唤。