2016-08-09 101 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)更新記錄。
要解決此問題,有兩種解決方案: 一個來自數據庫端: 您需要知道爲什麼存在有關地址的唯一約束。如果不需要,可以將其從數據庫中刪除。 另一個是確保(addressable_type,addressable_id)在將數據更新到數據庫之前是唯一的。

希望這可以給一個什麼樣的幫助

+0

謝謝@Eric - 我不明白爲什麼我使索引值唯一add_index「地址」,[「addressable_type」,「addressable_id」],名稱:「index_addresses_on_addressable_type_and_addressable_id」,unique:true,使用:: tree 我會試着找出爲什麼我這樣做,然後你的解決方案聽起來不錯。謝謝! – Mel