2010-09-09 12 views

Odpowiedz

25

Dla prawdziwego TRUNCATE, można użyć execute do uruchomienia surowego kodu SQL.

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

Twoje przykłady wykorzystujące modele nie robiły prawdziwe TRUNCATE zapytań.

  • destroy_all nie TRUNCATE stół. "Niszczy warunki dopasowania rekordów poprzez tworzenie instancji każdego rekordu i wywoływanie jego metody niszczenia" (link).
  • delete_all jest bliżej - ignoruje oddzwonienia - ale nadal nie jest to TRUNCATE.

Metoda usuwa wiersze z bazy danych bez tworzenia żadnych instancji modelu.

Również rzeczywiste TRUNCATE zapytań, przynajmniej w MySQL, zresetuje automatycznego przyrostu na klucz podstawowy, tak że następny rekord włożeniu będzie miał identyfikator 1.

0

Domyślam się, że twoja tabela złącz nazywa się categories_posts. CategoryPost.destroy_all powinny działać, jeśli nie, to może trzeba podać nazwę tabeli w modelu (CategoryPost)

set_table_name "categories_posts" 

Update, nie jest modelem CategoryPost, więc powinno być tworzone:

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

łączenia tabel nie masz powiązany model. np. "CategoryPost" –

+0

możesz go utworzyć – jordinl