2010-09-09 29 views

Répondre

25

Pour un véritable TRUNCATE, vous pouvez utiliser execute pour exécuter le SQL brut.

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

Vos exemples en utilisant des modèles ne sont pas en train de faire de véritables TRUNCATE requêtes.

  • destroy_all ne pas TRUNCATE une table. Il "détruit les conditions de correspondance des enregistrements en instanciant chaque enregistrement et en appelant sa méthode de destruction" (link). Plus proche - il ignore les rappels - mais toujours pas TRUNCATE

En utilisant la méthode execute supprime les lignes de la base de données sans créer des instances de modèle.

En outre, une requête TRUNCATE réelle, au moins dans MySQL, réinitialisera l'auto-augmentation de la clé primaire, de sorte que l'enregistrement suivant l'insertion aura id 1.

0

Je suppose que votre table de jointure est appelée categories_posts. CategoryPost.destroy_all devrait fonctionner, sinon, vous devez peut-être indiquer le nom de la table dans le modèle (CategoryPost)

set_table_name "categories_posts" 

mise à jour, il n'y a pas un modèle de CategoryPost, il devrait donc être créé:

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

tables de jointure ne sont pas modèle associé. par exemple, 'CategoryPost' –

+0

vous pouvez le créer – jordinl