如何截断rails中的连接表?

时间:2010-09-09 02:30:14

标签: ruby-on-rails activerecord truncate

要截断ActiveRecord表,我可以

Category.destroy_all

Post.destroy_all

如何截断categories_post表?

2 个答案:

答案 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