3

私の Rails アプリケーションには、invoiceを含むを複製するメソッドがありitemsます。

class Invoice < ActiveRecord::Base

  def duplicate
    dup.tap do |new_invoice|
      new_invoice.date = Date.today
      new_invoice.number = nil              <<<--------------
      items.each do |item|
        new_invoice.items.push item.dup
      end
    end
  end

end 

ここで、属性をまったくコピーしないようにしたいので、アクション内で新しいものを生成できます(簡潔にするために、ここでは示していません)。numbernumbernew

今、私はそれをnil私が望むものではないに設定しています。

何か案は ?

4

3 に答える 3

3

おそらくこれらの線に沿った何か:

def duplicate
  new_invoice = Invoice.new(attributes.except(:number))
  items.each do |item|
    new_invoice.items.push item.dup
  end
  new_invoice
end

または、保護された属性などを回避する必要がある場合は、属性をループします。ただしself.attributesHash#except を使用すると、おそらく必要なものになります。

于 2013-08-11T13:13:14.133 に答える
0

なぜだめですか

class Invoice < ActiveRecord::Base
  def clone
    number = self.number
    cloned = super
    cloned.number = number
  end
end
于 2013-08-11T12:31:08.127 に答える
0

新しい数値をパラメーターとして渡します。これは、最も単純で読みやすい手法です。

class Invoice < ActiveRecord::Base
  def duplicate(new_number = nil)
    dup.tap do |new_invoice|
      new_invoice.date = Date.today
      new_invoice.number = new_number
      items.each do |item|
        new_invoice.items.push item.dup
      end
    end
  end
end

次に、コントローラーで

class InvoicesController < ApplicationController
  def new
    ...
    @new_invoice = @invoice.duplicate(new_number)
  end
end
于 2013-08-11T12:55:13.217 に答える