Bir ActiveRecord nesnesini nasıl silebilirsiniz?


Yanıtlar:


572

Bu destroyve destroy_allyöntemler,

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

Alternatif kullanabilir deleteve delete_allhangi zorlamak olmaz :before_destroyve :after_destroygeri aramalar veya herhangi bağımlı dernek seçenekleri.

User.delete_all(condition: 'value') birincil anahtar olmadan kayıtları silmenize olanak tanır

Not : @ hammady'nin yorumundan, user.destroyKullanıcı modelinde birincil anahtar yoksa çalışmaz.

Not 2 : Rails 5.1'de @ pavel-chuchuva'nın yorumundan, destroy_allkoşullarla ve delete_allkoşullarla birlikte yorumu kaldırıldı - bkz. Guides.rubyonrails.org/5_1_release_notes.html


4
Cevabınıza @ hammady'nin yorumunu ekleseniz iyi olur. Model nesneyi neden yok edemediğimi öğrenmek için mücadele
ettik


Neden yalnızca veritabanımdaki deleted_at sütun verilerini güncelliyor? Tüm veri satırını nasıl silebilirim?
TommyQu

1
Rails 5.1'de koşullarla birlikte destroy_all ve koşullarla birlikte delete_all
Pavel Chuchuva

bu User.find_by(username:"bob") , yok edilecek veya silinecek kaydı belirlemek için de iyidir.
barlop

60

Orada delete, delete_all, destroy, ve destroy_all.

Belgeler şunlardır: eski belgeler ve Rails 3.0.0 belgeleri

deletenesneleri somutlaştırmaz, oysa destroy. Genel olarak, deletedaha hızlıdır destroy.


4
deletedaha hızlıdır ancak modelde tanımlamış olabileceğiniz geri aramaları atlar
Rudi

48
  1. User.destroy

User.destroy(1)ile kullanıcı silecektir id == 1ve :before_destroyve :after_destroygeri aramaları oluşur. Örneğin, ilişkili kayıtlarınız varsa

has_many :addresses, :dependent => :destroy

Kullanıcı yok edildikten sonra adresleri de yok edilecektir. Bunun yerine silme eylemini kullanırsanız geri aramalar gerçekleşmez.

  1. User.destroy, User.delete

  2. User.destroy_all(<conditions>) veya User.delete_all(<conditions>)

Uyarı : Kullanıcı bir sınıf ve kullanıcı bir örnek nesnedir


3
İlişkili kayıtları ele aldığınız için teşekkür ederiz.
Sage Mitchell

2
DİKKAT: User.destroy_all()geri çağrıları çalıştırır, bu nedenle herhangi bir şeyi silmeden önce kayıtları yükler. Bir değil iki SQL ifadesi. Performansın yanı sıra, bunun da eşzamanlılık etkileri vardır. Daha güvenli arama geri aramaları atlar; User.delete_all()sadece tek bir DELETE FROM...komut verecektir .
Andrew Hodgkinson

1
Rails 5.1'de koşullara sahip destroy_all kullanımdan kaldırıldı - bkz. guides.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.