如何复制或克隆模型?

Zec*_*eck 1 ruby activerecord ruby-on-rails

我有一个带有属性id,名称,价格的模型书.我有一个Book的实例:

b1 = Book.new
b1.name = "Blah"
b1.price = 12.5
b1.save
Run Code Online (Sandbox Code Playgroud)

我想复制b1,创建Product模型的另一个实例.我是tryid p1 = b1.clone然后p1.save但它没有用.任何的想法?

我的环境是:

  • Netbeans 6.9 RC2
  • JRuby 1.5.0

编辑: 我的临时产品型号:

class Admin::TemporaryProduct < ActiveRecord::Base

  def self.update_from_web_service(web_service_url)
    response = HTTParty.get(web_service_url)
    response["webServiceResult"]["product"].each do|element|
      unless exists? :orignal_product_id => element['id']
        create!(
          :name => element['name'],
          :price => element['price'],
          :amount => element['amount'],
          :description => element['description'],
          :orignal_product_id => element['id'],
          :image => element['image'],
          :shop_account_number => element['shopAccountNumber'],
          :unit => element['unit']
        )
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

产品是创建动作:

  def create
    @temporary_products = Admin::TemporaryProduct.find_all_by_orignal_product_id(params[:product])
    @product = Admin::Product.new(@temporary_products.attributes)
    # @product = @temporary_products.clone
    respond_to do |format|
      format.html { redirect_to(admin_products_url, :notice => 'Admin::Product was successfully created.') }
    end
  end
Run Code Online (Sandbox Code Playgroud)

我想将所有b1的属性克隆到p1模型.

Cho*_*ett 8

我想你想要:

b2 = Book.create(b1.attributes)
Run Code Online (Sandbox Code Playgroud)

编辑: 鉴于你create上面的动作,我想你想要做的是改变其启动线@product,以

@temporary_products.each {|tp| Admin::Product.create(tp.attributes)}
Run Code Online (Sandbox Code Playgroud)

这将为Product每个TemporaryProduct对象创建一个新对象,使用与之相同的属性TemporaryProduct.如果这不是你想要的,请告诉我.