在我的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
,这不是我想要的。
任何想法?
答案 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