Làm cách nào để xóa tất cả các bản ghi trong một trong các bảng cơ sở dữ liệu của tôi trong ứng dụng Ruby on Rails?
Làm cách nào để xóa tất cả các bản ghi trong một trong các bảng cơ sở dữ liệu của tôi trong ứng dụng Ruby on Rails?
Câu trả lời:
Nếu bạn đang tìm cách để không có SQL, bạn có thể sử dụng xóa_all.
Post.delete_all
hoặc với một tiêu chí
Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"
Xem ở đây để biết thêm thông tin.
Các bản ghi sẽ bị xóa mà không tải chúng trước, điều này làm cho nó rất nhanh nhưng sẽ phá vỡ chức năng như bộ đệm bộ đệm phụ thuộc vào mã đường ray được thực thi khi xóa.
ActiveRecord
mô hình. Câu hỏi hỏi về việc xóa bản ghi khỏi 'bảng' và tôi chỉ chỉ hoặc giả định được giữ trong câu trả lời.
Nếu bạn có nghĩa là xóa mọi phiên bản của tất cả các mô hình, tôi sẽ sử dụng
ActiveRecord::Base.connection.tables.map(&:classify)
.map{|name| name.constantize if Object.const_defined?(name)}
.compact.each(&:delete_all)
select
bất cứ khi nào bạn cần sử dụng biểu thức if bên trong một khối, theo cách này bạn tránh phải xâu chuỗi phương thức rút gọn để loại bỏ các phần tử không.
BlogPost.find_each(&:destroy)
Nếu mô hình của bạn được gọi là BlogPost, nó sẽ là:
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)
Câu trả lời gần đây hơn trong trường hợp bạn muốn xóa mọi mục trong mỗi bảng:
def reset
Rails.application.eager_load!
ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration }
end
Thêm thông tin về eager_load
đây .
Sau khi gọi nó, chúng ta có thể truy cập vào tất cả các hậu duệ ActiveRecord::Base
và chúng ta có thể áp dụng một delete_all
trên tất cả các mô hình.
Lưu ý rằng chúng tôi đảm bảo không xóa bảng SchemaMigration.