Как ограничить длину полей при создании индекса в миграции Rails? - PullRequest
4 голосов
/ 05 мая 2011

У меня есть миграция, которая добавляет индекс к существующей таблице, используя add_index:

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

Однако мои поля достаточно длинные, чтобы они превышали максимальную длину ключа InnoDB,Согласно ответу Андерса Арптега до Как мне увеличить длину ключа в 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 в моей миграции?

Ответы [ 4 ]

8 голосов
/ 05 мая 2011

Вы можете указать длины вручную для каждого поля, которое вы используете, чтобы остаться под общим лимитом:

add_index(:foo, [:foo_type, :bar_id, :baz_id], :unique => true, :length => {:foo_type => 100, :bar_id => 20, :baz_id => 20})
6 голосов
/ 05 мая 2011

Вы можете указать параметр длины, это сгенерирует точный SQL, который вы запрашивали:

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

Два недостатка:

  1. Параметр используется для всех трех ключей, поэтому вынельзя указать разные длины для отдельных ключей.
  2. Эта функция добавлена ​​в ActiveRecord :: ConnectionAdapters :: MysqlAdapter, поэтому для ее работы необходимо использовать MysqlAdapter (возможно, другие адаптеры также реализуют ее, я просто знаю,Rails не поддерживает его сам по себе).
1 голос
/ 06 августа 2014

Проверьте эту ссылку: https://github.com/rails/rails/issues/9855#issuecomment-28874587

Может быть, будет полезным, очень хорошо работает на моей стороне

0 голосов
/ 05 мая 2011

К сожалению, рельсы не поддерживают опцию: limit в add_index (по крайней мере, в 2.x). Однако вы всегда можете использовать execute вместо этого и ввести sql напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...