Как 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.
Ответы
Ответ 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 которого вы сбросите.
Я понял это благодаря ответу на этот вопрос.