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 

现在我想要的是根本不复制number属性,因此number可以在我的new操作中生成一个新属性(为简洁起见,我没有在这里展示)。

现在,我将其设置为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.attributes使用Hash#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 回答