Tom*_*man 63 activerecord ruby-on-rails
我可以Post.delete_all删除我的所有帖子,但如果我想删除所有帖子,评论,博客等怎么办?
如何迭代所有模型并运行delete_all方法?
Vla*_*anu 83
rake db:reset
Run Code Online (Sandbox Code Playgroud)
它从迁移中重新创建表.
正如评论中所建议的那样,更快的方法(但你必须添加一个新的rake任务)是:
namespace :db do
desc "Truncate all tables"
task :truncate => :environment do
conn = ActiveRecord::Base.connection
tables = conn.execute("show tables").map { |r| r[0] }
tables.delete "schema_migrations"
tables.each { |t| conn.execute("TRUNCATE #{t}") }
end
end
Run Code Online (Sandbox Code Playgroud)
回复来自:回答SO.
Sam*_*r C 28
您可以通过以下方式进行更好的控制
rake db:drop:all
Run Code Online (Sandbox Code Playgroud)
然后在不运行迁移的情况下创建数据库,
rake db:create:all
Run Code Online (Sandbox Code Playgroud)
然后运行所有迁移,
rake db:migrate
Run Code Online (Sandbox Code Playgroud)
你也可以这样做:
mysqladmin drop databasename
Run Code Online (Sandbox Code Playgroud)
Jam*_*sen 24
如果您尝试从代码而不是命令行执行此操作,例如从Test::Unit::TestCase#teardown方法中执行此操作,则可以执行此操作
class MyTest < Test::Unit::TestCase
def teardown
ActiveRecord::Base.subclasses.each(&:delete_all)
end
end
Run Code Online (Sandbox Code Playgroud)
要么
class MyTest < Test::Unit::TestCase
def teardown
Rake::Task['db:reset'].invoke
end
end
Run Code Online (Sandbox Code Playgroud)
但是我警告你:两者都不是特别快.如果可以的话,你肯定会更好地进行交易测试.
Ken*_*enB 17
如果您只想重新开始使用一组新的空表,则可以首先确保在db/schema.rb中拥有最新的模式定义:
rake db:schema:dump
Run Code Online (Sandbox Code Playgroud)
然后:
rake db:schema:load
Run Code Online (Sandbox Code Playgroud)
它具有删除表然后重新创建它们的效果,而无需遍历整个迁移过程.
Kah*_*Tim 12
在 Rails 6 中,您可以rails db:truncate_all删除所有数据而不删除任何表。
如果您想在此之后为您的数据库做种子,您还rails db:seed:replant可以截断所有数据和种子数据库
gef*_*gef 11
rails db:purge
最近已被添加到rails 4.2.0.alpha的主分支中的ActiveRecord
https://github.com/rails/rails/commit/e2f232aba15937a4b9d14bd91e0392c6d55be58d
Dav*_* J. 10
以一个更快的方法只是删除表行是使用TRUNCATE命令.
许多其他答案似乎忽略了删除行和删除表之间的区别.删除表会破坏表数据和模式; 意味着您需要额外的步骤来重新创建表.Sean McLeary的回答是我所见过的最好的,所以我用它作为起点.但是,我认为最好利用TRUNCATE命令,因为它应该更快并且还会重置自动增量键.此外,使用map而不是each缩短代码.
namespace :db do
desc "Truncate all tables"
task :truncate => :environment do
conn = ActiveRecord::Base.connection
tables = conn.execute("show tables").map { |r| r[0] }
tables.delete "schema_migrations"
tables.each { |t| conn.execute("TRUNCATE #{t}") }
end
end
Run Code Online (Sandbox Code Playgroud)
Postgres db 接受的答案:
namespace :db do
desc "Truncate all tables"
task :truncate => :environment do
conn = ActiveRecord::Base.connection
postgres = "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname='public'"
tables = conn.execute(postgres).map { |r| r['tablename'] }
tables.delete "schema_migrations"
tables.each { |t| conn.execute("TRUNCATE \"#{t}\"") }
end
end
Run Code Online (Sandbox Code Playgroud)
如果有foreign_key像这样的错误ActiveRecord::StatementInvalid (PG::FeatureNotSupported: ERROR: cannot truncate a table referenced in a foreign key constraint)
然后,CASCADE选项会有所帮助。
namespace :db do
desc "Truncate all tables"
task :truncate => :environment do
conn = ActiveRecord::Base.connection
postgres = "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname='public'"
tables = conn.execute(postgres).map { |r| r['tablename'] }
tables.delete "schema_migrations"
tables.each { |t| conn.execute("TRUNCATE \"#{t}\"") }
end
end
Run Code Online (Sandbox Code Playgroud)
如果在应用程序或 rails 控制台中使用数据时只想删除数据而不触及表:
Rails.application.eager_load!
ActiveRecord::Base.connection.disable_referential_integrity do
ApplicationRecord.descendants.each do |model|
model.delete_all
end
end
Run Code Online (Sandbox Code Playgroud)
使用此代码,您不必费心手动引用模型和/或外键约束(感谢 disable_referential_integrity)。
ApplicationRecord.descendants 只返回真正的应用程序模型,不像 ActiveRecord::Base.descendants(不再有 ApplicationRecord、schema_migrations 和 ar_internal_metadata)。
这也将适用于Rails 4
(ActiveRecord::Base.connection.tables - ['schema_migrations']).each do |table|
table.classify.constantize.destroy_all
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
58876 次 |
| 最近记录: |