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.