【问题标题】:Best way to duplicate parent and associated child records in Ruby on Rails? [duplicate]在 Ruby on Rails 中复制父记录和关联子记录的最佳方法? [复制]
【发布时间】:2012-11-02 19:05:18
【问题描述】:

可能重复:
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

或者我是否需要创建另一个名为 e.g. 的函数? copy 在我的控制器里面?

最佳做法是什么?

感谢您的任何意见...

【问题讨论】:

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


【解决方案1】:

逻辑应该在模型中

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

【讨论】:

    【解决方案2】:

    在您的创建操作中可能是这样的:

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

    当然,也有宝石可以为您做到这一点,但这是您的决定。

    【讨论】:

      猜你喜欢
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      相关资源
      最近更新 更多