svetozar
@svetozar
dudin.tv

Ошибка при создании индекса в БД Mysql2 — как указать длину составного ключа?

Сразу скажу, что в Sqlite ошибки нет.

Решил добавить гем "rolify" в качестве разграничения прав в связке с devise и cancancan. В development среде было все ОК, но когда закапистранил на сервер — обнаружилась ошибка:

-- add_index("roles", ["name", "resource_type", "resource_id"], {:name=>"index_roles_on_name_and_resource_type_and_resource_id"})
rake aborted!
ActiveRecord::StatementInvalid: Mysql2::Error: Specified key was too long; max key length is 1000 bytes: CREATE  INDEX `index_roles_on_name_and_resource_type_and_resource_id`  ON `roles` (`name`, `resource_type`, `resource_id`)


Как выяснилось — БД типа MyISAM имеет ограничения в 1000 байт, что с учетом UTF8 получается ~333 символа. Следовательно решение должно было быть таким:

добавить length: {name:100, resource_type:20, resource_id:11}

но увы этот параметр игнорируется! См:

-- add_index("roles", ["name", "resource_type", "resource_id"], {:name=>"index_roles_on_name_and_resource_type_and_resource_id", :length=>{:name=>100, :resource_type=>20, :resource_id=>11}})
rake aborted!
ActiveRecord::StatementInvalid: Mysql2::Error: Specified key was too long; max key length is 1000 bytes: CREATE  INDEX `index_roles_on_name_and_resource_type_and_resource_id`  ON `roles` (`name`, `resource_type`, `resource_id`)


Логичным решением получилось написать:
#execute "CREATE  INDEX `index_roles_on_name_and_resource_type_and_resource_id`  ON `roles` (`name`(100), `resource_type`(20), `resource_id`(11))"


Но это не работает в development среде. Что с этим сделать?
  • Вопрос задан
  • 402 просмотра
Пригласить эксперта
Ответы на вопрос 1
mannaro
@mannaro
Умею профессионально гуглить
Какая версия Ruby (и RoR)?
Пример из APIDoc:
add_index(:accounts, [:name, :surname], name: 'by_name_surname', length: {name: 10, surname: 15})
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы