2016-08-09 1 views
0

J'essaie de comprendre un problème que je continue à avoir dans la configuration des associations polymorphes dans mon application Rails 4.Rails 4 - Associations polymorphes avec une action de mise à jour sur les attributs polymorphes imbriqués

J'ai un modèle de projet et un modèle d'adresse. Les associations sont:

Profil

has_many :addresses, as: :addressable 
    accepts_nested_attributes_for :addresses, reject_if: :all_blank, allow_destroy: true 

Adresse

belongs_to :addressable, :polymorphic => true 

J'ai déjà posé cette question sur le même problème. Je ne pouvais pas (et ne peux toujours pas) comprendre les réponses dans ce post: Rails 4 - Polymorphic associations

Cette fois, j'ai un problème qui est déclenché lorsque j'essaie de mettre à jour un profil en insérant une adresse. Le message d'erreur identifie le problème comme provenant de l'action de mise à jour dans le contrôleur de profils. L'action de mise à jour a:

Mon profil une action de mise à jour du contrôleur a:

def update 

    # successful = @profile.update(profile_params) 

    # Rails.logger.info "xxxxxxxxxxxxx" 
    # Rails.logger.info successful.inspect 
    # [email protected] 
    # user.update.avatar 
    # Rails.logger.info "prof xxxxxxxxxxxxx" 
    # Rails.logger.info @profile.update(profile_params) 
    respond_to do |format| 
     if @profile.update(profile_params) 
     format.html { redirect_to @profile } 
     format.json { render :show, status: :ok, location: @profile } 
     else 
     format.html { render :edit } 
     format.json { render json: @profile.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Le message d'erreur indique:

ERROR: duplicate key value violates unique constraint "index_addresses_on_addressable_type_and_addressable_id" 
DETAIL: Key (addressable_type, addressable_id)=(Profile, 1) already exists. 

Est-ce que quelqu'un sait ce que ce message signifie, et comment y remédier?

+0

Ceci est une erreur PSQL, cela signifie qu'il existe déjà une entrée dans la base de données avec addresable_type comme « Profil » et addressable_id « 1 ». Cela signifie que vous créez une nouvelle adresse dans votre action de mise à jour. – nzajt

+0

Savez-vous comment je pourrais en faire une mise à jour sur l'enregistrement existant? – Mel

Répondre

0

Dans votre base de données, vous avez défini une contrainte unique: vous pouvez accéder à la base de données pour voir ce que vous avez défini sous le nom "index_addresses_on_addressable_type_and_addressable_id". Lorsque le message d'erreur s'affiche, vous essayez de mettre à jour un enregistrement avec la valeur (Profile, 1) qui a déjà été utilisée par un autre enregistrement.
Pour résoudre ce problème, il existe deux solutions: on est du côté de la base de données: vous devez savoir pourquoi il existe une contrainte unique sur les adresses. Si ce n'est pas nécessaire, vous pouvez le supprimer de la base de données. l'autre est de s'assurer que le type (addressable_type, addressable_id) est unique avant de mettre à jour vos données dans la base de données.

espère que cela peut donner une sorte d'aide

+0

Merci @Eric - Je ne peux pas penser pourquoi j'ai fait la valeur d'index unique add_index "adresses", ["addressable_type", "addressable_id"], nom: "index_addresses_on_addressable_type_and_addressable_id", unique: vrai, en utilisant:: arbre Je vais essayez et découvrez pourquoi je l'ai fait et votre solution sonne bien. Merci! – Mel