Как скопировать или клонировать модель? - PullRequest
1 голос
/ 14 июня 2010

У меня есть модель книги с атрибутами 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

РЕДАКТИРОВАНИЕ: Модель My 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 ]

8 голосов
/ 14 июня 2010

Я думаю, что вы хотите:

b2 = Book.create(b1.attributes)

Edit: Учитывая ваше create действие выше, я думаю, что вы хотите изменить строку, начинающуюся с @product на

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

Это создаст новый объект Product для каждого объекта TemporaryProduct, используя те же атрибуты, что и TemporaryProduct. Если это не то, что вы хотите, дайте мне знать.

0 голосов
/ 24 января 2019

Вы можете сделать дубликат записи, используя dup в рельсах. Например,

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

или вы можете создать первую новую запись, а затем создать дубликат

Надеюсь, это полезно для вас.

0 голосов
/ 14 июня 2010

Если под не работает, вы имеете в виду, что в базе данных нет новой записи, тогда вы, вероятно, захотите установить нулевой идентификатор p1 перед сохранением.Если у клона тот же идентификатор, что и у оригинала, то он будет представлять тот же объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...