要截断ActiveRecord表,我可以
Category.destroy_all
或
Post.destroy_all
如何截断categories_post
表?
答案 0 :(得分:27)
对于真正的TRUNCATE
,您可以使用execute
来运行原始SQL。
ActiveRecord::Base.connection.execute("TRUNCATE TABLE #{table_name}")
使用模型的示例未执行真正的TRUNCATE
查询。
destroy_all
没有TRUNCATE
一张桌子。它“通过实例化每条记录并调用其销毁方法来破坏记录匹配条件”(link)。delete_all
更接近 - 它忽略了回调 - 但仍然不是TRUNCATE
。使用execute
方法从数据库中删除行而不创建任何模型实例。
此外,实际的TRUNCATE
查询(至少在MySQL中)将重置主键的自动增量,以便您插入的下一条记录的id为1。
答案 1 :(得分:0)
我猜你的连接表叫做categories_posts。 CategoryPost.destroy_all应该可以工作,如果没有,也许你需要在模型中指定表名(CategoryPost)
set_table_name "categories_posts"
更新,没有CategoryPost模型,因此应该创建:
class CategoryPost < ActiveRecord::Base
set_table_name "categories_posts"
end