2011-05-05 63 views
4

我有一个迁移,增加了一个索引使用add_index现有表:在Rails迁移中创建索引时,如何限制字段长度?

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

然而,我的领域是足够长的时间,他们超过最大InnoDB的密钥长度。按照Anders Arpteg's answerHow do I increase key length in 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)) 

我可以在一个不错的Rails-Y的方式做到这一点,或者我必须弯腰在我的迁移使用原始的SQL?

回答

-1

不幸的是,轨道不支持:限制选项add_index(至少在2.X) 。但是,您可以始终使用execute来直接输入sql。

+0

Rails 2.x **不支持:length选项。 – 2011-05-05 14:35:00

+0

@dmarkow:请链接。 – 2011-05-06 09:34:54

+0

与我的其他评论相同的链接 - 我在这里的评论意味着虽然它可能不支持:限制选项(我不明白这是如何影响你的问题,因为:限制选项与创建/改变字段/列,而不是索引),它支持:length选项。 http://rubydoc.info/docs/rails/2.3.8/ActiveRecord/ConnectionAdapters/SchemaStatements#add_index-instance_method – 2011-05-06 13:09:39

7

您可以为每个使用,留在总限额下的字段中指定手动长度:

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

该指数的**名的长度**是没有问题的。 – 2011-05-05 14:30:34

+0

糟糕,相应地更新了我的答案。 – 2011-05-05 14:34:00

+0

这对Rails 2.3.11不适用于我;你测试了什么版本? – 2011-05-05 15:27:37

6

您可以指定长度参数,这将产生你问的确切SQL:

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

两个缺点:

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

非常好!我认为我不能(或不应该)在这里切换适配器,所以我想我会选择安德斯的“执行”解决方案,但我相信您的解决方案适合我船上的其他人。 :) – 2011-05-05 14:32:32