【问题标题】:How to copy or clone model?如何复制或克隆模型?
【发布时间】:2010-06-14 10:23:18
【问题描述】:

我有一本带有 id、name、price 属性的模型书。我有一个 Book 的实例:

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

我想复制 b1,创建 Product 模型的另一个实例。我尝试了 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

产品是创建动作:

  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 模型中。

【问题讨论】:

  • 在您发布的create 操作中,@temporary_products 将是Admin::TemporaryProduct 类型的对象数组。 attributes 是单个实例的方法。我不太清楚您是要克隆所有结果,还是只克隆一个,或者您是否希望 find_all_by_original_product_id 只返回 1 个结果。
  • 我不这么认为。它返回一个数组。
  • 是的,我知道它返回一个数组。因此@temporary_products.attributes 不起作用,因为.attributes单个实例 的方法。您是要克隆所有退回的临时产品,还是只克隆一个?
  • 好的,我明白了。我只是想克隆所有的临时产品。但这是工作。我收到一个错误。
  • 好的。我将在下面编辑我的答案。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

我想你想要:

b2 = Book.create(b1.attributes)

编辑: 鉴于上述create 操作,我认为您想要做的是将@product 开头的行更改为

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

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

【讨论】:

  • b1.attributes 函数未找到!
  • b1 = Admin::TemporaryProduct, p1 = Admin::Product
  • b1 = Admin::TemporaryProduct.new, p1 = Admin::Product.new
【解决方案2】:

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

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

或者你可以创建第一条新记录,然后复制

希望这对你有用。

【讨论】:

  • 我认为这是最地道的答案。
【解决方案3】:

如果by不工作,你的意思是数据库中没有新记录,那么你可能想在保存之前将p1的id设置为null。如果克隆与原始的 id 相同,那么它似乎代表同一个对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2022-10-24
    • 2011-08-08
    • 2018-04-01
    • 1970-01-01
    相关资源
    最近更新 更多