Ruby on Rails:数据类型外键

时间:2016-01-01 14:04:07

标签: mysql ruby-on-rails ruby database ruby-on-rails-4

我有以下表格:

  • 主键ID的路径(ID,名称)
  • 使用主键ID停止(ID,名称)
  • 映射(Route_ID,Stop_ID)

Route和Stop中的ID在我的Mysql-DB中的类型为BIGINT(20)。迁移失败,因为使用此:

class CreateMappings < ActiveRecord::Migration
def change
  create_table :mappings do |t|
    t.references :route, index: true, foreign_key: true
    t.references :stop, index: true, foreign_key: true

    t.timestamps null: false
  end
  end
end

使用route_id和stop_id创建表映射,但数据类型为INT(11)。这与BIGINT(20)不兼容。我怎样才能解决这个问题?有任何想法吗?外键的创建失败。

错误消息

这是rake db:migrate --trace输出的一部分:

  

**调用db:migrate(first_time)   **调用环境(first_time)   **执行环境   **调用db:load_config(first_time)   **执行db:load_config   **执行db:migrate   == 20151227194101 CreateMappings:迁移===================================    - create_table(:mappings)rake aborted! StandardError:发生错误,所有以后的迁移都被取消:

     

Mysql2 ::错误:无法添加外键约束:ALTER TABLE   mappings添加约束fk_rails_1b9f715271外键   (route_id)参考routesid

当我尝试使用MySql-Client执行上述SQL语句(ALTER TABLE mappings ...)时,出现此错误:

Failed to add the foreign key constaint. MIssing index for constraint 'fk_rails_1b9f715271' in the referenced table 'routes'.

2 个答案:

答案 0 :(得分:5)

references方法如果您不希望添加的列为整数,则采用类型选项,例如

t.references :route, type: :bigint, index: true, foreign_key: true

答案 1 :(得分:0)

你试过这个表格吗?

class CreateMappings < ActiveRecord::Migration
  def change
    create_table :mappings do |t|
      t.references :route
      t.references :stop

      t.timestamps null: false
    end
  end
  add_index(:mappings, :route)
  add_index(:mappings, :stop)
end