Сразу скажу, что в 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 среде. Что с этим сделать?