Как укоротить таблицу соединений в рельсах? - PullRequest
9 голосов
/ 09 сентября 2010

Чтобы обрезать таблицу ActiveRecord, я могу сделать

Category.destroy_all

или

Post.destroy_all

Как можно обрезать таблицу categories_post?

Ответы [ 2 ]

27 голосов
/ 11 ноября 2011

Для истинного TRUNCATE вы можете использовать execute для запуска необработанного SQL.

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

В ваших примерах с использованием моделей не выполнялись истинные TRUNCATE запросы.

  • destroy_all не TRUNCATE таблица.Он «уничтожает условия соответствия записей, создавая каждую запись и вызывая ее метод уничтожения» ( link ).
  • delete_all ближе - он игнорирует обратные вызовы - но все же не TRUNCATE.

Использование метода execute удаляет строки из базы данных без создания экземпляров модели.

Кроме того, фактический запрос TRUNCATE, по крайней мере в MySQL, будет сброшенавтоинкремент первичного ключа, так что следующая вставляемая запись будет иметь идентификатор 1.

0 голосов
/ 09 сентября 2010

Полагаю, ваша таблица соединений называется category_posts. CategoryPost.destroy_all должен работать, если нет, возможно, вам нужно указать имя таблицы в модели (CategoryPost)

set_table_name "categories_posts"

Обновление, модель CategoryPost отсутствует, поэтому ее следует создать:

class CategoryPost < ActiveRecord::Base
  set_table_name "categories_posts"
end 
...