2010-09-09 16 views

risposta

25

Per un valore reale TRUNCATE, è possibile utilizzare execute per eseguire l'SQL raw.

ActiveRecord::Base.connection.execute("TRUNCATE TABLE #{table_name}") 

I suoi esempi che utilizzano modelli non stavano facendo veri TRUNCATE query.

  • destroy_all non TRUNCATE un tavolo. "Distrugge i record che corrispondono alle condizioni istanziando ogni record e chiamando il suo metodo destroy" (link).
  • delete_all è più vicino - ignora le richiamate - ma non è ancora un TRUNCATE.

L'utilizzo del metodo execute elimina le righe dal database senza creare istanze di modello.

Inoltre, un vero e proprio TRUNCATE interrogazione, almeno in MySQL, ripristinerà l'auto-incremento sulla chiave primaria, in modo che il prossimo disco si inserisce avrà id 1.

0

Immagino che la tua tabella di join sia chiamata categories_posts. CategoryPost.destroy_all dovrebbe funzionare, se non, forse è necessario specificare il nome della tabella nel modello (CategoryPost)

set_table_name "categories_posts" 

Update, non c'è un modello di CategoryPost, quindi dovrebbe essere creato:

class CategoryPost < ActiveRecord::Base 
    set_table_name "categories_posts" 
end 
+0

unire le tabelle non hanno un modello associato. ad esempio, 'CategoryPost' –

+0

puoi crearlo – jordinl