2010-06-14 86 views
1

我有一个模型与属性id,名称,价格的书。我有书的一个实例:如何复制或克隆模型?

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

我想复制B1,创造产品型号的另一个实例。我是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模型。

+0

在您发布的'create'动作中,'@ temporary_products'将是一个'Admin :: TemporaryProduct'类型的对象数组。 'attributes'是一个单一实例的方法。我不清楚您是要克隆所有结果,还是仅仅一个,或者您是否期望'find_all_by_original_product_id'只返回1个结果。 – Chowlett 2010-06-14 11:43:59

+0

我不这么认为。它返回一个数组。 – Zeck 2010-06-14 12:01:08

+0

是的,我知道它返回一个数组。因此'@ temporary_products.attributes'将不起作用,因为'.attributes'是*单​​个实例*的一种方法。你想克隆所有返回的临时产品,还是只有一个? – Chowlett 2010-06-14 12:38:00

回答

7

我想你想:

b2 = Book.create(b1.attributes) 

编辑: 鉴于你上面create行动,我想你想要做的是改变其开始@product

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

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

+0

未找到b1.attributes函数! – Zeck 2010-06-14 10:29:37

+0

真的吗?这很奇怪。你可以发布班级书的代码吗? – Chowlett 2010-06-14 10:33:29

+0

b1 = Admin :: TemporaryProduct,p1 = Admin :: Product – Zeck 2010-06-14 10:49:14

0

如果没有工作,您的意思是数据库中没有新的记录,那么您可能希望在保存之前将p1的id设置为null。如果克隆与原始文件具有相同的id,那么它看起来代表同一个对象。