在Rails迁移中创建索引时如何限制字段长度?

Jos*_*ver 4 ruby-on-rails

我有一个迁移,它使用add_index以下内容为现有表添加索引:

add_index :foo, [:foo_type, :bar_id, :baz_id], :unique => true
Run Code Online (Sandbox Code Playgroud)

但是,我的字段足够长,超过了最大的InnoDB密钥长度.根据Anders Arpteg如何增加MySQL 5.1密钥长度的回答,我需要像这样生成SQL:

CREATE UNIQUE INDEX `index_matches_on_foo_and_bar_id_and_baz_id` ON `matches` (`foo`(100), `bar_id`(100), `baz_id`(100))
Run Code Online (Sandbox Code Playgroud)

我可以用漂亮的Rails-y方式做到这一点,还是我必须坚持在迁移中使用原始SQL?

Dyl*_*kow 8

您可以为您使用的每个字段指定手动长度,以保持在总限制之下:

add_index(:foo, [:foo_type, :bar_id, :baz_id], :unique => true, :length => {:foo_type => 100, :bar_id => 20, :baz_id => 20})
Run Code Online (Sandbox Code Playgroud)


Jan*_*rik 6

您可以指定长度参数,这将生成您要求的确切SQL:

add_index :foo, [:foo_type, :bar_id, :baz_id], :unique => true, :length => 100
Run Code Online (Sandbox Code Playgroud)

两个缺点:

  1. 该参数用于所有三个键,因此您无法为各个键指定不同的长度.
  2. 这个功能是在ActiveRecord :: ConnectionAdapters :: MysqlAdapter中添加的,所以你必须使用MysqlAdapter才能工作(也许其他适配器也可以实现它,我只知道Rails本身不支持它).


小智 0

不幸的是,rails 不支持 add_index 中的 :limit 选项(至少在 2.x 中不支持)。但是,您始终可以使用execute 来直接输入sql。