如何复制或克隆模型?

时间:2010-06-14 10:23:18

标签: ruby-on-rails ruby activerecord

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

b1 = Book.new
b1.name = "Blah"
b1.price = 12.5
b1.save

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

我的环境是:

  • Netbeans 6.9 RC2
  • JRuby 1.5.0

编辑: 我的TemporaryProduct模型:

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

产品是创造行动:

  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

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

3 个答案:

答案 0 :(得分:8)

我想你想要:

b2 = Book.create(b1.attributes)

修改 鉴于您上面的create操作,我认为您要做的是将@product开始的行更改为

@temporary_products.each {|tp| Admin::Product.create(tp.attributes)}

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

答案 1 :(得分:0)

如果by不起作用,则表示数据库中没有新记录,那么您可能希望在保存之前将p1的id设置为null。如果克隆具有与原始相同的id,那么它似乎代表相同的对象。

答案 2 :(得分:0)

您可以在滑轨中使用dup进行重复记录,例如

b1 = Book.create(name: "example", price: 120)
b1.save
duplicate_record = b1.dup
duplicate_record.save!

或者您可以创建第一个新记录,然后进行重复

希望这对您有用。