Raylar: bağımlı =>: VS'yi yok et: bağımlı =>: delete_all


192

Ray kılavuzlarında şöyle tarif edilir:

Nesneler, ilişkili oldukları takdirde yok edilir :dependent => :destroyve ilişkili oldukları takdirde silinir:dependent => :delete_all

Doğru, havalı. Peki yok edilmek ve silinmek arasındaki fark nedir? İkisini de denedim ve aynı şeyi yapıyor gibi görünüyor.

Yanıtlar:


200

Aradaki fark geri arama ile.

:delete_allUygulamanızda doğrudan yapılan ve SQL tarafından siler edilir:

DELETE * FROM users where compagny_id = XXXX

İle, :destroytüm çocuklarınızın bir örneği vardır. Yani, onu yok edemiyorsanız ya da her birinin kendine ait olması durumunda :dependent, geri çağrıları çağrılabilir.


83
Çok sayıda çocuğunuz varsa (ve torunlarınız varsa n ^ 2), her bir nesnede örnekleme ve yok etme çağrısı yavaş olacaktır. delete_all, modellerde geri aramaları yok etmeden önce / sonra umursamadığınız / sahip olmadığınız "yörüngeden nuke" çözümü türüdür.
Ryan Bigg

131

Bir Rails model ilişkilendirmesinde :dependent, aşağıdaki üç formdan birini alabilen seçeneği belirtebilirsiniz :

  • :destroy/:destroy_allİlişkili nesneler kendi destroyyöntemlerini çağırarak bu nesnenin yanında imha edilir
  • :delete/:delete_allİlişkili tüm nesneler kendi :destroyyöntemlerini çağırmadan hemen imha edilir
  • :nullifyİlişkili tüm nesnelerin yabancı anahtarları geri çağrılarını NULLçağırmadan olarak ayarlanmıştırsave


21
Rails 3.0'dan beri belirtmek de mümkündür :restrict. Şuna ayarlanırsa: restrict bu nesne, ilişkili bir nesneye sahipse silinemez.
RocketR

17
Görünüşe göre hayır :deleteveya :destroy_allseçenek var mı? : Bağımlı seçenek şunlardan birini bekler: yok,: delete_all,: nullify veya: restrict (: delete)
Mike Campbell

2
@MikeCampbell :deleteve :destroy_allseçenekler mevcut değil. Bununla birlikte, çağrılan modellerde sınıf yöntemleri vardır deleteve destroy_allbu yüzden karışıklığın nedeni olabilir.
berezovskyi

[: Yok,: delete_all: nullify: restrict_with_error: restrict_with_exception] bağımlı seçenek biri olmalıdır: Sen birkaç seçenek daha eksik @MikeCampbell Bakınız
Pravin Mishra

30

Bkz Delete ilişkili yokedecektir nerede delete_all öz tablodan birden verileri silebilir olarakDELETE * FROM table where field = 'xyz'

: Bağımlı olası seçenekler:

Sahipleri yok edildiğinde ilişkili nesnelere ne olacağını kontrol eder. Bunların geri arama olarak uygulandığını ve Rails geri aramaları sırayla yürüttüğünü unutmayın. Bu nedenle, diğer benzer geri aramalar aşağıdakileri etkileyebilir: bağımlı davranış ve :dependentdiğer geri çağrıları etkileyebilir.

:destroy ilişkili tüm nesnelerin de yok olmasına neden olur.

:delete_all ilişkili tüm nesnelerin doğrudan veritabanından silinmesine neden olur (bu nedenle geri aramalar yürütülmez).

:nullifyyabancı anahtarların NULL olarak ayarlanmasına neden olur. Geri arama yapılmaz.

:restrict_with_exception ilişkilendirilmiş kayıtlar varsa istisna oluşturulmasına neden olur.

:restrict_with_error ilişkili nesneler varsa sahibine bir hata eklenmesine neden olur.

Bu :throughseçenekle birlikte kullanılıyorsa , birleştirme modelindeki ilişkilendirmenin ait olması gereken_ve silinmiş olan kayıtlar ilişkili kayıtlar yerine birleştirme kayıtlarıdır.


3

Aslında asıl fark, kullanıldığında herhangi bir geri çağrının çağrılmamasıdır :delete_all. Ancak :destroygeri çağrılar kullanıldığında yığın ( :after_destroy, :after_commit...) tetiklenir.

Sonuç olarak, touch:silinmekte olan modellerde bildirimler varsa , o zaman dependent: :delete_all'bağımlı:: yok' kullanmak daha iyidir .

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.