Подтвердить что ты не робот

Как reset автоматически увеличивать поле в миграции ActiveRecord?

В моей миграции я:

def up
   MyModel.destroy_all
   MyModel.create!({:id=>1,:name=>'foo'})
   MyModel.create!({:id=>2,:name=>'fooBar'})
   MyModel.create!({:id=>3,:name=>'fooNull'})
end

потому что мне нужно переопределить данные, которые уже были в таблице my_models

Но даже если я указываю id в MySQL, он продолжает нумерацию с позиции, которая уже была.

Мне нужно поставить счетчик на автоматическое приращение для id, чтобы иметь только эти 3 новые записи с этими значениями id через миграцию Active Record в моем приложении Ruby on Rails.

4b9b3361

Ответ 1

У вас есть 2 отдельных вопроса. Во-первых, вы пытаетесь указать идентификатор с массовым назначением, рельсы не позволят вам это сделать. См. Переопределение идентификатора для создания в ActiveRecord для способа сделать это.

Другая проблема заключается в том, что автоинкремент не сбрасывается. Каждая СУБД имеет уникальный способ установки счетчика приращений, а рельсы не дают вам общего доступа к ним, хотя для некоторых из них (а не для MySQL) они реализованы, см. Rails путь к reset семя в поле id

Таким образом, для этого вам потребуется запустить SQL-специфический SQL-код, что-то вроде:

ALTER TABLE my_models AUTO_INCREMENT = 1;

Это должно быть reset к числу после наибольшего id в вашей таблице (1, если таковых нет)

Ответ 2

Если вы используете PostgreSQL, вы можете просто:

ModelName.connection.execute('ALTER SEQUENCE model_name_id_seq RESTART WITH 1')

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

User.connection.execute('ALTER SEQUENCE users_id_seq RESTART WITH 1')

Ответ 3

В случае, если кто-то еще задается вопросом, как это сделать с MYSQL: вот код, который будет использоваться при миграции для reset автоматического приращения для таблицы:

ActiveRecord::Base.connection.execute('ALTER TABLE foo_bars AUTO_INCREMENT = 1')
  • Где foo_bars будет имя таблицы, auto_increment которого вы сбросите.

Я понял это благодаря ответу на этот вопрос.