2012-01-13 6 views
11

Nella mia migrazione ho:Come resettare il campo di incremento automatico in una migrazione di 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 

perché ho bisogno di ignorare i dati che era già sul tavolo my_models

Ma Anche se sto specificando il id su MySQL continua la numerazione dalla posizione in cui si già lo era.

Ho bisogno di appoggiare il contatore sull'aumento automatico per id per avere solo questi 3 nuovi record con tali valori di id attraverso la migrazione di Active Record sull'applicazione Ruby on Rails.

risposta

23

Hai 2 problemi separati. Uno è che stai cercando di specificare l'id con l'assegnazione di massa, le rotaie non ti permetteranno di farlo. Vedere Overriding id on create in ActiveRecord per un modo per farlo.

L'altro problema è che l'incremento automatico non viene ripristinato. Ogni DBMS ha un modo univoco di impostare un contatore di incrementi e le rotaie non ti danno un modo generico per accedervi, anche se è implementato per alcuni di essi (non MySQL), vedi Rails way to reset seed on id field

Quindi avrai bisogno per eseguire il codice SQL specifica MySQL per questo, che è qualcosa di simile a:

ALTER TABLE my_models AUTO_INCREMENT = 1; 

questo dovrebbe azzerare il numero dopo il più grande id nella tabella (1 se non ce ne sono)

4

Se sei usando PostgreSQL puoi semplicemente fare:

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

Per esempio, il ripristino del campo di incremento automatico per il modello d'uso sarà simile:

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

ALTER SEQUENCE non è supportato da MySQL – PinnyM

+1

Questo funziona su Postgres – Xavier

2

nel caso qualcuno si chiede altro come fare questo con MySQL: ecco il codice si potrebbe utilizzare nella migrazione in per azzerare l'incremento automatico per una tabella:

ActiveRecord::Base.connection.execute('ALTER TABLE foo_bars AUTO_INCREMENT = 1') 
  • Dove foo_bars sarebbe il nome della tabella di cui auto_increment si sta reimpostando.

L'ho capito grazie alla risposta per this question.

Problemi correlati