Làm thế nào để bạn xóa một đối tượng ActiveRecord?


328

Làm thế nào để bạn xóa một đối tượng ActiveRecord?

Tôi đã xem Active Record Querying và nó không có gì để xóa mà tôi có thể thấy.

  1. Xóa bởi id,

  2. Xóa đối tượng hiện tại như : user.remove,

  3. Bạn có thể xóa dựa trên một wheređiều khoản?

Câu trả lời:


572

Đó là destroydestroy_allphương pháp, như

user.destroy
User.find(15).destroy
User.destroy(15)
User.where(age: 20).destroy_all
User.destroy_all(age: 20)

Ngoài ra, bạn có thể sử dụng deletedelete_allsẽ không thực thi :before_destroy:after_destroygọi lại hoặc bất kỳ tùy chọn liên kết phụ thuộc.

User.delete_all(condition: 'value') sẽ cho phép bạn xóa các bản ghi mà không cần khóa chính

Lưu ý : từ nhận xét của @ hammadian, user.destroysẽ không hoạt động nếu Mô hình người dùng không có khóa chính.

Lưu ý 2 : Từ nhận xét của @ pavel-chuchuva, destroy_allvới các điều kiện và delete_allđiều kiện đã không được chấp nhận trong Rails 5.1 - xem hướng dẫn.rubyonrails.org/5_1_release_notes.html


4
Sẽ thật tuyệt nếu bạn có thể đưa bình luận của @ hammady vào câu trả lời của mình. Cố gắng tìm hiểu lý do tại sao tôi không thể phá hủy đối tượng mô hình của mình ...
the_critic


Tại sao nó chỉ cập nhật dữ liệu cột remove_at trong cơ sở dữ liệu của tôi? Làm thế nào tôi có thể xóa toàn bộ hàng dữ liệu?
TommyQu

1
hủy_all với điều kiện và xóa_all với điều kiện đã không được chấp nhận trong Rails 5.1 - xem hướng dẫn.rubyonrails.org/5_1_release_notes.html
Pavel

điều này User.find_by(username:"bob") cũng tốt để xác định bản ghi để hủy hoặc xóa.
barlop

60

delete, delete_all, destroy, và destroy_all.

Các tài liệu là: tài liệu cũtài liệu Rails 3.0.0

deletekhông khởi tạo các đối tượng, trong khi destroyđó. Nói chung, deletelà nhanh hơn destroy.


4
deletenhanh hơn nhưng bỏ qua các cuộc gọi lại mà bạn có thể đã xác định trên mô hình
Rudi

48
  1. User.destroy

User.destroy(1)sẽ xóa người dùng với id == 1:before_destroy:after_destroycallbacks xảy ra. Ví dụ: nếu bạn có hồ sơ liên quan

has_many :addresses, :dependent => :destroy

Sau khi người dùng bị phá hủy, địa chỉ của anh ta cũng sẽ bị hủy. Nếu bạn sử dụng hành động xóa thay thế, cuộc gọi lại sẽ không xảy ra.

  1. User.destroy, User.delete

  2. User.destroy_all(<conditions>) hoặc là User.delete_all(<conditions>)

Lưu ý : Người dùng là một lớp và người dùng là một đối tượng thể hiện


3
Cảm ơn đã giải quyết các hồ sơ liên quan.
Sage Mitchell

2
BEWARE: User.destroy_all()chạy các cuộc gọi lại, vì vậy trước khi xóa bất cứ thứ gì, nó sẽ tải các bản ghi. Đó là hai câu lệnh SQL không phải là một. Ngoài ý nghĩa về hiệu suất, điều này cũng có ý nghĩa tương tranh. Cuộc gọi an toàn hơn bỏ qua cuộc gọi lại; User.delete_all()sẽ chỉ phát hành một DELETE FROM...lệnh duy nhất .
Andrew Hodgkinson

1
hủy_all với các điều kiện đã không được chấp nhận trong Rails 5.1 - xem hướng dẫn.rubyonrails.org/5_1_release_notes.html
Pavel

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.