2010-10-29 15 views
36

Ruby on Rails kılavuzlarını inceledim ve eğer bir Çocuk varsa, bir Ebeveyn kaydını silmenin nasıl önleneceğini anlayamıyorum. Örneğin. Veritabanımın MÜŞTERİLER varsa ve her bir müşteri birden çok ORDERS alabilirse, veritabanında herhangi bir emir varsa, bir müşteriyi silme işlemini engellemek istiyorum. Siparişleri olmayan bir müşteriyi yalnızca silmeleri gerekir.Çocuk kayıtlarında ebeveynin silinmesini nasıl önleyebilirim?

Bu davranışı zorlamak için modeller arasındaki ilişkiyi tanımlamanın bir yolu var mı?

cevap

43

Bir geri arama yapabilirsiniz:

class Customer < ActiveRecord::Base 
    has_many :orders 
    before_destroy :check_for_orders 

    private 

    def check_for_orders 
    if orders.count > 0 
     errors.add_to_base("cannot delete customer while orders exist") 
     return false 
    end 
    end 
end 

DÜZENLEME

Bunu yapmak için daha iyi bir yol için this answer görüyoruz.

+5

Bu iyi yoldur kullanmalıdır. Bu en temiz ve kodunuz üzerinde çalışıyor olsaydı tam olarak böyle bir filtre arardım. Geri aramada "yanlış" ifadesinin geri alınması, rayların harekete devam etmemesini söyleyen şeydir. –

+0

'has_any ...?' :) –

+0

Teşekkürler, Joe. Hayır, ben yeni bir ilişki türü icat etmedim ... – zetetic

0

İstek işleme sırasında özel kodda kanca yapmak için filters kullanmayı deneyin.

0

Kullanıcılarınızın, bu senaryoda silinmeye yönelik bir bağlantı sağlamasını engellemek bir olasılıktır. Özellikle,

if [email protected]? 
    flash[:notice] = "Cannot delete a customer with orders" 
    render :action => :some_action 
end 

Veya Joe anlaşılacağı gibi, before_filters burada işe yarayabilir ve muhtemelen bunu yapmanın çok daha KURU şekilde olacaktır:

link_to_unless [email protected]? 

diğer yolu da denetleyicisi bu işlemek olur Bu tür davranışları sadece Müşteriden daha fazla model için istiyorsanız.

81
class Customer < ActiveRecord::Base 
    has_many :orders, :dependent => :restrict # raises ActiveRecord::DeleteRestrictionError 

Düzenleme: Raylar 4.1 itibariyle :restrict geçerli bir seçenek değildir ve bunun yerine ya :restrict_with_error veya :restrict_with_exception

Örn .:

class Customer < ActiveRecord::Base 
    has_many :orders, :dependent => :restrict_with_error 
+0

Teşekkürler! Temiz;) Bunu düşündüm ref. Rails'de bütünlük varsayılan olarak açıktı ... – luigi7up

+1

Kısıtlama mesajı özelleştirilebilir mi? –

+2

Bu cevap lütfen Ray 4.1 ve üstü değişiklikleri yansıtmak için güncellenebilir mi? "Kullanımdan kaldırılmış seçenek için kaldırılan destek: kısıtlama: ilişkilere bağımlı." http://edgeguides.rubyonrails.org/4_1_release_notes.html. : Bağımlı seçeneğin [: destroy,: delete_all,: nullify,: restrict_with_error,: restrict_with_exception] olması gerekir – Marklar

İlgili konular