如何在Rails seeds.rb中清除整个数据库

时间:2011-08-08 16:25:19

标签: ruby-on-rails

实现这一目标的最佳方法是什么?至于现在我正在使用:

Role.delete_all
User.delete_all
...

但如何清除habtm talbes?喜欢roles_users

更新答案

我认为ream88的回答最准确地回答了我的问题,但可能是bestidea遵循coreyward建议使用单独的rake任务并将seeds.rb留给播种数据。

这是来自ream88的更新答案,它不会删除schema_migrations表。

ActiveRecord::Base.establish_connection
ActiveRecord::Base.connection.tables.each do |table|
  # MySQL
  ActiveRecord::Base.connection.execute("TRUNCATE #{table}") unless table == "schema_migrations"

  # SQLite
  # ActiveRecord::Base.connection.execute("DELETE FROM #{table}") unless table == "schema_migrations"
end

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:42)

首先,我认为混合这样的问题并不是一个好主意。 seeds.rb文件旨在使数据为数据库设定种子,而不是重置数据。已经有一个rake任务,用于重置只运行rake db:migrate:reset的数据库(rake db:drop db:create db:migrate)。如果您想要为新数据库设定种子,可以运行rake db:reset db:seed

答案 1 :(得分:16)

我绝对同意@ coreyward的回答,但是如果你真的要清除seeds.rb文件中的所有表格,那么这个代码片段就可以完成这个工作:

ActiveRecord::Base.establish_connection
ActiveRecord::Base.connection.tables.each do |table|
  next if table == 'schema_migrations'

  # MySQL and PostgreSQL
  ActiveRecord::Base.connection.execute("TRUNCATE #{table}")

  # SQLite
  # ActiveRecord::Base.connection.execute("DELETE FROM #{table}")
end

答案 2 :(得分:4)

您可以尝试Rake::Task["db:reset"]调用。

rake db:reset只是一个rake任务,你可以调用它来重置数据库,使用Rake :: Task让你从脚本中调用它。