Bir veritabanı tablosundaki tüm kayıtları silme


Yanıtlar:


249

SQL olmadan bir yol arıyorsanız delete_all kullanabilmelisiniz.

Post.delete_all

veya bir kriterle

Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"

Daha fazla bilgi için buraya bakın .

Kayıtlar önce yüklenmeden silinir, bu da onu çok hızlı yapar, ancak silme sırasında çalıştırılacak ray koduna bağlı olan sayaç önbelleği gibi işlevselliği bozar.


13
Şunu belirtmek gerekir ki: bağımlı =>: yok etme veya silme üzerine temizlenmesi gereken herhangi bir şey varsa, muhtemelen Post.destroy_all'ı isteyeceksiniz - çok daha yavaş olsa da. Bkz apidock.com/rails/ActiveRecord/Base/destroy_all/class
Michael Hellein

Bu cevap, tablonun kendisiyle ilişkilendirilmiş bir modele sahip olduğunu varsayar. OP bunu belirtmedi - ya masa bir birleştirme tablosu ise?
Toby 1 Kenobi

1
@BradWerth, bazıları tarafından iyi veya kötü bir stil olarak kabul edilsin veya edilmesin, sadece bir Rails db'nin ActiveRecordmodel olmayan tablolara sahip olmasının mümkün olduğunu söylüyorum . Soru, bir 'tablodan' kayıt silme hakkında soruyor ve ben sadece işaret ediyorum veya cevapta tutulan varsayımı.
Toby 1 Kenobi

@ Toby1Kenobi ile aynı sorgu var.
nbsamar

30

SQL ile silmek için

Item.delete_all # accepts optional conditions

Her modelin yok etme yöntemini çağırarak silmek için (pahalıdır ancak geri aramaların çağrılmasını sağlar)

Item.destroy_all # accepts optional conditions

Hepsi burada


21

Veritabanını tamamen boşaltmak ve sadece ona bağlı bir modeli veya modelleri silmek istemiyorsanız şunları yapabilirsiniz:

rake db:purge

bunu test veritabanında da yapabilirsiniz

rake db:test:purge

5

Tüm modellerin her bir örneğini silmek istiyorsan, şunu kullanırım

ActiveRecord::Base.connection.tables.map(&:classify)
  .map{|name| name.constantize if Object.const_defined?(name)}
  .compact.each(&:delete_all)

1
selectBir bloğun içinde bir if ifadesi kullanmanız gerektiğinde tercih edin, bu şekilde sıfır öğeleri kaldırmak için kompakt yöntemi zincirlemek zorunda kalmazsınız.
Sebastian Palma

4
BlogPost.find_each(&:destroy)

Bu, düşük hafıza koşulları için harikadır.
Epigene

Hafıza tüketimini hesaba katan tek cevap budur.
John

2
Omg, neden bunun için bir döngü oluşturmalıyım ... hiç mantıklı değil. sadece tüm kayıtları silin tablodan SİL, Model.delete_all
Imnl

@John neden tek bir sorgu, bir sorgu döngüsünden daha fazla bellek tüketiyor?
Imnl

@Imnl Her yineleme, silme yöntemi için geri aramaları işleyebilmek için söz konusu modelin yeni bir örneğini oluşturur.
John

2

Modelinizin adı BlogPost ise, şu olur:

BlogPost.all.map(&:destroy)

bu, her bir BlogPost'u getirecek ve yok etmeden önce bir Ruby dizisine yükleyecektir.
hdgarrood

ORM'ye bağlıdır. Datamapper bunu yapmaz çünkü her model hakkında hiçbir şey istemezsiniz. Ve işte her bir girişi yok etmeden önce herhangi bir alan seçmediğini gösteren bir Mongoid yığın izi: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)
stef

4
bu bir ray sorusu olduğundan ve soruyu soran hangi
ORM'yi kullandığını söylemediğinden,

2

Her tablodaki her girişi silmek istemeniz durumunda daha yeni cevap:

def reset
    Rails.application.eager_load!
    ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration  }
end

Burada hakkında daha fazla bilgieager_load .

Onu aradıktan sonra, tüm torunlarına erişebilir ActiveRecord::Baseve birdelete_all ve tüm modellere .

SchemaMigration tablosunu temizlemediğimizden emin olduğumuzu unutmayın.

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.