除了一个属性外,如何在Rails中复制记录?

时间:2013-08-11 12:29:25

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

在我的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,这不是我想要的。

任何想法?

3 个答案:

答案 0 :(得分:2)

沿着这些方向的东西也许:

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可能是您想要的。

答案 1 :(得分:0)

为什么不

class Invoice < ActiveRecord::Base
  def clone
    number = self.number
    cloned = super
    cloned.number = number
  end
end

答案 2 :(得分: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