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