Как мне работать с автоматически увеличивающимися первичными ключами во время миграции - PullRequest
0 голосов
/ 02 декабря 2011
create table foo (id auto increment primary key, name varchar(255))

Я написал простой сценарий миграции rails, который создает новую запись на self.up и сбрасывает ее на self.drop с delete(:id => 1). Если я выполняю db: migrate, он создает новую запись с id = 1, а если я выполняю откат, он удаляется. Проблема возникает, если я перенесу / отброшу еще раз, когда запись будет создана с первичным ключом id = 2, и мой сценарий сброса завершится неудачно при откате.

Очень важно, чтобы первичный ключ каждый раз был одним и тем же, поскольку у меня есть другие зависимости, основанные на этом. Какой должен быть правильный способ справиться с этим.

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

Вы не должны использовать миграции для добавления начальных данных, вместо этого используйте файл db/seed.rb. Это будет переустанавливать ваши начальные данные, когда вы выполните rake db:reset, это также сбросит ваши счетчики идентификаторов, чтобы у данных были предсказуемые идентификаторы. Данные, добавленные в процессе миграции, не будут перезагружены при выполнении rake db:reset!

0 голосов
/ 02 декабря 2011

То, что делает это, это опция AUTO_INCREMENT в MySQL. Я не думаю, что ActiveRecord позволяет отключить его. Однако вы можете отключить его, удалив значение AUTO_INCREMENT для поля id в MySQL (для этого вам придется выполнить запрос MySQL.)

Если подумать, вы ведете некоторые записи о сиротах в своей базе данных. Я не верю, что это будет правильно. Попробуйте удалить эти вещи из консоли Rails, если модели должным образом настроены для удаления зависимых записей при удалении материнской записи, а затем используйте некоторые сценарии rake или что-то еще, чтобы снова добавить данные и установить необходимые ассоциации.

0 голосов
/ 02 декабря 2011

Я думаю, что правильным способом справиться с этим является удаление таблицы вместо удаления записей.Когда вы создаете таблицу в своем методе self.up, вы можете выполнить ее удаление.

 def down
    drop_table :system_settings
  end
...