使用seeds.rb删除数据库中所有表的所有记录

时间:2015-07-02 14:07:47

标签: ruby-on-rails activerecord

现在,我的方法是一次列出每个表格并在其上调用.delete_all。这是重复的:

示例:

#app/db/seeds.rb

Blog.delete_all
Person.delete_all
Post.delete_all
User.delete_all
Author.delete_all
Book.delete_all
# ... on and on for all the tables

然后当然运行rake db:seed,这将清除上表中的所有记录。

是否有一个完全符合我要求的命令:

  • 删除所有表中的所有记录而不删除表本身?

或者,有没有办法遍历我的所有表格并在每张桌子上.delete_all

5 个答案:

答案 0 :(得分:7)

  

是否有一个命令可以完全符合我的要求:删除所有命令   所有表中的记录?

bundle exec rake db:reset

这在功能上等同于rake db:drop db:setup

不想删除表格吗?

#app/db/seeds.rb
[Blog, Person, Post, User, Author, Book].each do |table|
  ActiveRecord::Base.connection.execute("TRUNCATE #{table.table_name}")
end

SQL-TRUNCATE

答案 1 :(得分:5)

由于OP要求删除所有表中的所有记录,而不是所有表。因此,您可以通过以下方式获取所有表:<TextView android:text="@string/hello_world" android:background="#FF0000" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ,它将为您提供数据库中的所有表。

ActiveRecord::Base.connection.tables

修改

如果您希望puts ActiveRecord::Base.connection.tables ActiveRecord::Base.connection.tables.each do |table| next if table.match(/\Aschema_migrations\Z/) klass = table.singularize.camelize.constantize klass.delete_all end 再次从id重新开始,当您在清空表后1新实例时,您必须create该表,然后重新启动 - 创造它。

destroy

现在,如果您创建模型ActiveRecord::Migration.drop_table(:users) ActiveRecord::Migration.create_table(:users) 的新实例,它将从User开始生成id。请注意,您需要在1drop_table函数中发送表的名称,而我上面编写的代码会为您提供类的名称,在本例中为{{1 }}。如果您拥有模型的名称,则可以获取表名称:

create_table

答案 2 :(得分:4)

如果您真的想编写ruby代码来执行此操作,请尝试使用ObjectSpace获取Class的每个实例,然后选择从ActiveRecord :: Base继承的类

models = ObjectSpace.each_object(Class).select { |klass| klass < ActiveRecord::Base }
models.each{|m|m.delete_all}

然而,答案提示不同的rake任务,而不是将其包含在seeds.rb中可能是解决问题的更好方法。

答案 3 :(得分:1)

如果强制rails加载所有模型,则可以迭代它们

Rails.application.eager_load!

# This only gets direct subclasses, since we are just deleting
# No reason to get their subclasses
models = ActiveRecord::Base.subclasses

models.each(&:delete_all)

答案 4 :(得分:0)

我将这些行添加到我的seeds.rb文件中。使用此代码,您不必费心手动引用模型和/或外键约束(感谢disable_referential_integrity)。

Rails.application.eager_load!
ActiveRecord::Base.connection.disable_referential_integrity do
  ApplicationRecord.descendants.each do |model|
    model.delete_all
  end
end

注意:与ActiveRecord :: Base.descendants不同,ApplicationRecord.descendants仅返回真正的应用程序模型(不再有ApplicationRecord,schema_migrations和ar_internal_metadata)。