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

时间:2011-05-05 14:12:05

标签: ruby-on-rails

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

add_index :foo, [:foo_type, :bar_id, :baz_id], :unique => true

但是,我的字段足够长,超过了最大的InnoDB密钥长度。根据{{​​3}}到Anders Arpteg's answer,我需要像这样生成SQL:

CREATE UNIQUE INDEX `index_matches_on_foo_and_bar_id_and_baz_id` ON `matches` (`foo`(100), `bar_id`(100), `baz_id`(100))

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

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:6)

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

add_index :foo, [:foo_type, :bar_id, :baz_id], :unique => true, :length => 100

两个缺点:

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

答案 2 :(得分:1)

检查此链接: https://github.com/rails/rails/issues/9855#issuecomment-28874587

可能确实很有帮助,在我身边很有效

答案 3 :(得分:-1)

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