2016-08-09 7 views
0

Я пытаюсь понять проблему, которую я, похоже, не имею при настройке полиморфных ассоциаций в моем приложении Rails 4.Rails 4 - Полиморфные ассоциации с действием обновления на вложенные полиморфные атрибуты

У меня есть модель проекта и модель адреса. Ассоциации являются:

Профиль

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

Адрес

belongs_to :addressable, :polymorphic => true 

Я уже задавал этот вопрос на одной и той же проблемы. Я не мог (и до сих пор не могу) понять ответы в этой должности: Rails 4 - Polymorphic associations

На этот раз - У меня возникла проблема, которая срабатывает, когда я пытаюсь обновить профиль, вставив адрес. Сообщение об ошибке идентифицирует проблему как результат действия обновления в контроллере профилей. Действие обновление имеет:

Мой профиль действия контроллера обновление имеет:

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 

сообщение об ошибке говорит:

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. 

Кто-нибудь знает, что означает это сообщение, и как решить ее?

+0

Это ошибка PSQL, это означает, что уже существует запись в базе данных с addresable_type как «Профиль» и addressable_id как «1». Таким образом, это означает, что вы создаете новый Addressable в своем действии обновления. – nzajt

+0

Знаете ли вы, как я мог сделать это в обновлении существующей записи? – Mel

ответ

0

В вашей базе данных вы установили уникальное ограничение: вы можете перейти в базу данных, чтобы узнать, что вы установили по имени «index_addresses_on_addressable_type_and_addressable_id». Как показано в сообщении об ошибке, вы пытаетесь обновить запись со значением (Profile, 1), которое уже использовалось другой записью.
Для решения этой проблемы существует два решения: one is from the database side: вам нужно знать, почему существует уникальное ограничение по адресам. если это не нужно, вы можете удалить его из базы данных. другой - убедиться, что (addressable_type, addressable_id) уникален до того, как вы обновите свои данные в базе данных.

надеюсь, что это может дать своего рода помощь

+0

Спасибо @Eric - я не могу понять, почему я сделал значение индекса уникальным add_index «адреса», [«addressable_type», «addressable_id»], имя: «index_addresses_on_addressable_type_and_addressable_id», unique: true, используя:: tree Я буду попробуйте и выясните, почему я это сделал, а затем ваше решение отлично звучит. Благодаря! – Mel

 Смежные вопросы

  • Нет связанных вопросов^_^