Ruby on Rails: внешний ключ типа данных

У меня есть следующие таблицы:

  • Маршрут (идентификатор, имя) с идентификатором первичного ключа
  • Стоп (ID, Имя) с ID первичного ключа
  • Отображение (Route_ID, Stop_ID)

Идентификаторы в Route и Stop имеют тип BIGINT (20) в моей Mysql-DB. Миграция не удалась, потому что с помощью этого:

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

Создает таблицу Mappings с route_id и stop_id, но с типом данных INT (11). Это несовместимо с BIGINT (20). Как я могу это исправить? Любые идеи? Не удается создать внешние ключи.

Сообщения об ошибках

Это часть вывода rake db:migrate --trace:

** Invoke db: migrate (first_time) ** Invoke environment (first_time) ** Execute environment ** Invoke db: load_config (first_time) ** Execute db: load_config ** Execute db: migrate == 20151227194101 CreateMappings: migrating === ================================ - create_table (: mappings) rake прервано! StandardError: Произошла ошибка, все последующие миграции отменены:

Mysql2 :: Ошибка: невозможно добавить ограничение внешнего ключа: ALTER TABLE mappings ADD CONSTRAINT fk_rails_1b9f715271 FOREIGN KEY (route_id) ССЫЛКИ routes (id)

Когда я пытаюсь выполнить приведенный выше оператор SQL (ALTER TABLE _8 _...) с помощью MySql-Client, я получаю следующую ошибку:

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

person 今天春天    schedule 01.01.2016    source источник
comment
Что за сообщение об ошибке?   -  person Simone Carletti    schedule 01.01.2016
comment
Добавил в вопрос.   -  person 今天春天    schedule 01.01.2016


Ответы (2)


Метод references принимает параметр типа, если вы не хотите, чтобы добавляемый столбец был целым числом, например

t.references :route, type: :bigint, index: true, foreign_key: true
person Frederick Cheung    schedule 02.01.2016

Вы пробовали эту форму?

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
person errata    schedule 01.01.2016
comment
Это не помогает, потому что результирующий тип данных маршрута будет int, а не bigint. - person 今天春天; 01.01.2016