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.
Xóa bởi
id
,Xóa đối tượng hiện tại như :
user.remove
,Bạn có thể xóa dựa trên một
where
điều khoản?
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.
Xóa bởi id
,
Xóa đối tượng hiện tại như : user.remove
,
Bạn có thể xóa dựa trên một where
điều khoản?
Câu trả lời:
Đó là destroy
và destroy_all
phươ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 delete
và delete_all
sẽ không thực thi :before_destroy
và :after_destroy
gọ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.destroy
sẽ 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_all
vớ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
User.find_by(username:"bob")
cũng tốt để xác định bản ghi để hủy hoặc xóa.
Có delete
, delete_all
, destroy
, và destroy_all
.
Các tài liệu là: tài liệu cũ và tài liệu Rails 3.0.0
delete
không khởi tạo các đối tượng, trong khi destroy
đó. Nói chung, delete
là nhanh hơn destroy
.
delete
nhanh 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
User.destroy
User.destroy(1)
sẽ xóa người dùng với id == 1
và :before_destroy
và :after_destroy
callbacks 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.
User.destroy
, User.delete
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
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 .
Đây là một liên kết đến các tài liệu rails , đó là những điều cơ bản trong Active Record