2

遷移了這個遷移remove_reference和add_reference報告沒有外鍵

def change 
    remove_reference :order_items, :order, foreign_key: true 
end 

或者這種遷移

def change 
    add_reference :order_items, :order, foreign_key: true 
end 

遷移下跌引發此錯誤下來的遷移:

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

Table 'order_items' has no foreign key for {:to_table=>"orders"} 
G:/Rails/learn_rails/db/migrate/20170222035809_move_order_items_under_restaurant_orders.rb:3:in `change' 
G:/Rails/learn_rails/bin/rails:4:in `require' 
G:/Rails/learn_rails/bin/rails:4:in `<top (required)>' 
-e:1:in `load' 
-e:1:in `<main>' 
ArgumentError: Table 'order_items' has no foreign key for {:to_table=>"orders"} 
G:/Rails/learn_rails/db/migrate/20170222035809_move_order_items_under_restaurant_orders.rb:3:in `change' 
G:/Rails/learn_rails/bin/rails:4:in `require' 
G:/Rails/learn_rails/bin/rails:4:in `<top (required)>' 
-e:1:in `load' 
-e:1:in `<main>' 
Tasks: TOP => db:migrate 
(See full trace by running task with --trace) 

My order_items table does have order_id column (and it is indexed) and I do have orders table, but then why isn't rails finding the column order_id and dropping it?

我暫時解決它

remove_index :order_items, :order_id 
remove_column :order_items, : order_id 

但我做什麼,如果我必須遷移下來add_reference

+0

版本'5.0.1' –

回答

0

order_items表具有order_id列和和索引index_order_items_on_order_id

但它沒有外鍵作爲錯誤明確表示。

在數據庫中進行交叉檢查(如果存在),如圖所示(有許多工具可用)。外鍵是在形式fk_rails_hash

enter image description here

在我的情況下,外鍵的不當導出轉儲過程中丟失,當我進口的sql_dump和遷移我的數據,這個數據庫的,他們不在場,儘管指數和專欄都保留了下來。

解決方案:

  • 刪除列,並添加引用正確的方式

    remove_index :order_items, :order_id 
    remove_column :order_items, :order_id 
    add_reference :order_items, :order, foreign_key: true 
    
    # or add only the foreign the key constraint 
    # i'm afraid it I would miss anything else doing so 
    
  • 最佳的解決方案,如果有這麼多的外鍵在軌道上失蹤

    # instead of whole sql_dump 
    # export only the data 
    
    rails db:migrate:reset 
    
    # import only the data making sure the insert 
    # happens in the right order as it may violate 
    # foreign_key constraints that are newly added