现在,我的方法是一次列出每个表格并在其上调用.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
?
答案 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
答案 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
。请注意,您需要在1
和drop_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)。