2017-08-15 41 views
1

我試圖將新的外鍵列添加到我的Customers表中。這是我的移民:Rails中的外鍵 - 錯誤

class AddCompanyForeignKeyToCustomers < ActiveRecord::Migration[5.1] 
    def change 
    add_reference :customers, :company, foreign_key: true 
    add_foreign_key :customers, :companies 
    end 
end 

這是我得到的錯誤:

rake aborted! 
StandardError: An error has occurred, this and all later migrations canceled: 

PG::DuplicateObject: ERROR: constraint "fk_rails_ef51a916ef" for relation "customers" already exists 
: ALTER TABLE "customers" ADD CONSTRAINT "fk_rails_ef51a916ef" 
FOREIGN KEY ("company_id") 
    REFERENCES "companies" ("id") 

ActiveRecord::StatementInvalid: PG::DuplicateObject: ERROR: constraint "fk_rails_ef51a916ef" for relation "customers" already exists 
: ALTER TABLE "customers" ADD CONSTRAINT "fk_rails_ef51a916ef" 
FOREIGN KEY ("company_id") 
    REFERENCES "companies" ("id") 

PG::DuplicateObject: ERROR: constraint "fk_rails_ef51a916ef" for relation "customers" already exists 

是什麼任何的意思呢?我不知道fk_rails_ $ NUMBER是什麼。

回答

1

您試圖通過呼叫add_referenceadd_foreign_key兩次添加外鍵。該文檔會告訴你更多,但基本上add_foreign_key添加一個鍵和add_reference 可以添加一個外鍵(你正在做foreign_key:true在你的代碼上面),所以你應該只使用一個或另一個。

如果我是你,我只想用add_foreign_key,似乎更適合你想要做什麼:

class AddCompanyForeignKeyToCustomers < ActiveRecord::Migration[5.1] 
    def change 
    add_foreign_key :customers, :companies 
    end 
end 
1

這意味着你要創建一個複製外鍵約束一個你已經擁有。

該行創建於customers外鍵約束引用companies,以及創建company_id

add_reference :customers, :company, foreign_key: true 

該行正試圖做外鍵約束再次

add_foreign_key :customers, :companies 

只是刪除一個或另一個,取決於您是否還需要添加company_id