1

重複の可能性:
ActiveRecord:ネストされた関連付けを複製するにはどうすればよいですか?

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

copyまたは、コントローラー内などの名前の別の関数を作成する必要がありますか?

ベストプラクティスは何ですか?

ご入力いただきありがとうございます...

4

2 に答える 2

7

ロジックはモデルに入れる必要があります

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
于 2012-11-03T05:07:46.183 に答える
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を作成アクションに渡し、複製する請求書を見つけて、その子アイテムを重複アイテムの配列に処理することができます。最後のステップは、新しく複製されたアイテムを新しく複製された請求書に追加することです。これは明らかにテストされておらず、あなたの側で少し追加の作業が必要になるでしょうが、アイデアの要点を理解していただければ幸いです。おそらくこれを達成する他の方法があります。

もちろん、これを行うことができる gem もありますが、それはあなた次第です。

于 2012-11-02T19:20:03.290 に答える