如何在rails中播种之前清除数据库

Jes*_*tny 1 ruby database sqlite ruby-on-rails sqlite3-ruby

是否有一行简单的代码可以包含在种子文件的顶部,以便在插入新的种子数据之前清除每个表而不运行任何rake命令来回滚表或数据库?

我想的是:

[Foo, Bar].each{|class| class.destroy_all}
Run Code Online (Sandbox Code Playgroud)

关键是我想添加新数据,其中每个新插入从id开始:1.我想要避免的是删除一个包含100行的表,当我添加新数据时,它从101开始.

Vis*_*gda 8

更新的答案

您要安装(或者您可以添加gem 'database_cleaner'到您的Gemfile)一个名为Database Cleaner的GEM ,它有助于清理您的数据库而不会影响您的数据库架构

.每次每次rake db:seed粘贴时都要清理数据库然后粘贴

# updated
require 'database_cleaner'

DatabaseCleaner.clean_with(:truncation)
Run Code Online (Sandbox Code Playgroud)

在种子文件的顶部.它将清除您的数据库并重新开始计数1.


免责声明:此更新的答案已经过测试,并且在我的系统中完美运行.



================================================== =========================

以前未经测试的答案

你能做到这一点,但这取决于你正在使用哪个数据库.

下面我为一些流行的数据库提供解决方案.

MySQL中,TRUNCATE table; 删除所有行并重置自动增量计数器.

PostgreSQL中,它不会自动执行此操作.你可以用TRUNCATE TABLE table RESTART IDENTITY;.

SQLite中,没有TRUNCATE语句,相反,它是

DELETE FROM table;
DELETE FROM sqlite_sequence WHERE name='table';
Run Code Online (Sandbox Code Playgroud)


你也可以试试这个

ActiveRecord::Base.connection.tables.each do |table|
  ActiveRecord::Base.connection.execute("TRUNCATE #{table}")
end
Run Code Online (Sandbox Code Playgroud)


您可以选择任何一个解决方案并将其实现到种子文件中.

我希望这能帮到您... ;)


免责声明:为了您的帮助,我已经分享了我的知识,但这个解决方案没有经过测试.