【发布时间】:2011-07-16 09:22:08
【问题描述】:
如何在 Ruby on Rails 应用程序中删除我的一个数据库表中的所有记录?
【问题讨论】:
标签: ruby-on-rails ruby database ruby-on-rails-3
如何在 Ruby on Rails 应用程序中删除我的一个数据库表中的所有记录?
【问题讨论】:
标签: ruby-on-rails ruby database ruby-on-rails-3
如果您的模型名为 BlogPost,则为:
BlogPost.all.map(&:destroy)
【讨论】:
MOPED: 127.0.0.1:27017 QUERY database=a_database collection=nothings selector={} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.3378ms)
如果您正在寻找一种不使用 SQL 的方法,您应该能够使用 delete_all。
Post.delete_all
或有条件
Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"
更多信息请参见here。
记录在没有先加载的情况下被删除,这使其速度非常快,但会破坏计数器缓存等功能,该功能取决于删除时要执行的 Rails 代码。
【讨论】:
ActiveRecord 模型的表是可行的。该问题询问有关从“表”中删除记录的问题,我只是指出或答案中的假设。
如果您想完全清空数据库,而不仅仅是删除一个或多个附加到它的模型,您可以这样做:
rake db:purge
你也可以在测试数据库上做
rake db:test:purge
【讨论】:
通过 SQL 删除
Item.delete_all # accepts optional conditions
通过调用每个模型的destroy方法来删除(昂贵但确保调用回调)
Item.destroy_all # accepts optional conditions
全部here
【讨论】:
BlogPost.find_each(&:destroy)
【讨论】:
如果你的意思是删除所有模型的每个实例,我会使用
ActiveRecord::Base.connection.tables.map(&:classify)
.map{|name| name.constantize if Object.const_defined?(name)}
.compact.each(&:delete_all)
【讨论】:
select,这样您就不必链接紧凑方法来删除 nil 元素。
如果您想删除每个表中的每个条目,则提供最新答案:
def reset
Rails.application.eager_load!
ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration }
end
更多关于eager_loadhere的信息。
调用之后,我们可以访问ActiveRecord::Base的所有后代,我们可以在所有模型上应用delete_all。
请注意,我们确保不清除 SchemaMigration 表。
【讨论】: