2010-06-14 6 views
1

J'ai un modèle de livre avec les attributs ID, nom, prix. J'ai une instance de livre:Comment copier ou copier un modèle?

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

Je voudrais copier b1, créer une autre instance du modèle de produit. Je suis tryid p1 = b1.clone puis p1.save mais ça n'a pas marché. Une idée?

Et mon environnement est:

  • Netbeans 6.9 RC2
  • JRuby 1.5.0

ÉDITÉ: Mon modèle 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 

Le produit est de créer action:

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 

Je souhaite cloner tous les attributs de b1 sur le modèle p1.

+0

Dans votre action 'create' publiée,' @ temporary_products' sera un tableau d'objets de type 'Admin :: TemporaryProduct'. 'attributes' est une méthode d'une instance unique. Je ne suis pas tout à fait clair si vous voulez cloner tous les résultats, ou juste un, ou si vous vous attendez 'find_all_by_original_product_id' pour retourner seulement 1 résultat. – Chowlett

+0

Je ne pense pas. C'est retourner un tableau. – Zeck

+0

Oui, je sais qu'il retourne un tableau. Par conséquent '@ temporary_products.attributes' ne fonctionnera pas, car' .attributes' est une méthode d'une * instance unique *. Essayez-vous de cloner tous les produits temporaires retournés, ou juste un? – Chowlett

Répondre

7

Je pense que vous voulez:

b2 = Book.create(b1.attributes) 

Edit: Étant donné votre action create ci-dessus, je pense que ce que vous voulez faire est de changer la ligne qui commence @product à

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

Ce va créer un nouvel objet Product pour chaque objet TemporaryProduct, en utilisant les mêmes attributs que le TemporaryProduct. Si ce n'est pas ce que vous voulez, faites le moi savoir.

+0

Fonction b1.attributes introuvable! – Zeck

+0

Vraiment? C'est étrange. Pouvez-vous poster le code pour le livre de classe? – Chowlett

+0

b1 = Administrateur :: TemporaryProduct, p1 = Admin :: Produit – Zeck

0

Si cela ne fonctionne pas, vous voulez dire qu'il n'y a pas de nouvel enregistrement dans la base de données, alors vous voulez probablement mettre l'ID de p1 à zéro avant de sauvegarder. Si le clone a le même identifiant que l'original, il semblerait qu'il représente le même objet.