【问题标题】:How do I limit field lengths when creating an index in a Rails migration?在 Rails 迁移中创建索引时如何限制字段长度?
【发布时间】:2011-05-05 14:12:05
【问题描述】:

我有一个使用add_index 向现有表添加索引的迁移:

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 方式来做这件事,还是必须在我的迁移中使用原始 SQL?

【问题讨论】:

标签: ruby-on-rails


【解决方案1】:

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

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

【讨论】:

  • 索引的name的长度不是问题。
  • 这不适用于 Rails 2.3.11;你在哪个版本上测试过?
  • 我没有测试它(我没有安装 MySQL),但 Rails 2.3.8 文档显示了这个作为示例:add_index(:accounts, [:name, :surname], :name => 'by_name_surname', :length => {:name => 10, :surname => 15})
  • 这真的很奇怪——你有那个文档的链接吗?
【解决方案2】:

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

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

两个缺点:

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

【讨论】:

  • 非常好!我想我不能(或不应该)在这里切换适配器,所以我想我会选择 Anders 的execute 解决方案,但我确信您的解决方案适合我船上的其他人。 :)
【解决方案3】:

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

【讨论】:

  • Rails 2.x 确实支持 :length 选项。
  • 与我的其他评论相同的链接——我在这里的评论意味着虽然它可能不支持 :limit 选项(我看不出这会如何影响您的问题,因为 :limit 选项必须创建/更改字段/列,而不是索引),它确实支持 :length 选项。 rubydoc.info/docs/rails/2.3.8/ActiveRecord/ConnectionAdapters/…
猜你喜欢
  • 2018-01-31
  • 1970-01-01
  • 2021-09-06
  • 2012-01-18
  • 1970-01-01
  • 2017-02-21
  • 2017-10-03
  • 2015-03-01
  • 2010-10-16
相关资源
最近更新 更多