2012-07-29 15 views
7

Şu an kaydedilen bir kaydedilenin belirli bir kapsam içine düşüp düşmediğini kontrol etmeye çalışıyorum. Bu 'kapsam' gerçekten bir arama için sadece bazı kaydedilmiş argümanlar. Ayrıca, bu 'kapsam' ile, yalnızca nesnenin değerlerini kontrol ediyorum, veritabanındaki diğer nesnelerle nasıl bir ilişki kurduğunu hiç bilmiyorum, bu yüzden eğer mantıklı olursa veritabanını sorgulamak her zaman öldürülür.Belirli Bir Etkin Kayıt Nesnesinin Özel Bir Kapsam İçinde Olup Olmadığını Kontrol Etme

Ben yalnızca aşağıda çözümü

begin 
    result = self.class.where(scope).find(self.id) 
rescue 
    result = false 
end 
bununla sorunu Zaten kayıt var olsa bile veritabanını sorgulamak zorunda olduğunu

ile gelip mümkün olmuştur ve bu değil koşmak zorunda Sadece kaydetmeden önce ama kaydedilen değerlerin kontrol edilmesi için kaydedildikten sonra kaydedildi ve kaydedildikten sonra kaydedilecek olan değerler, eğer kayıtlı değilse güncellenmiş versiyon için veritabanını sorgulamanın bir yolu yoktur.

Bu denetimler bir dizi olabilir, bu yüzden iki kez yapmak zorunda kalmamak ve aynı zamanda veritabanını sorgulamak zorunda kalmak istiyorum, sonuçta ben sadece bir şey kimliği ile bakıyorum bile.

Düşünebildiğim tek diğer çözüm, bir nesneyi geçtiği zaman bir boole döndüren bir proc aramasının nasıl yapılacağını çeviren bir yönteme sahip olmaktı. Bununla ilgili tek sorun, bir kısmının, kendi başına bir proje gibi görünen, kullanılan aktif kayıt bağdaştırıcısıyla nasıl çalışması gerektiğidir. Peki, bunu yapmanın bir yolu ya da yardım edebilecek bir gemiyi bilen var mı?

PS Önbellekten 'kapsamı' alıyorum, böylece bir proc olarak kaydedemiyorum çünkü proksları Rails ile önbelleğe koyamazsınız. senin nesne nitelikleri kapsamı değerlerini varsa veritabanını kontrol etmek istemiyorsanız

+1

Kaydetmekte olduğunuz kaydın somut bir örneğini, kapsam koşullarının neye benzediğini ve neden bunu yapmaya çalıştığınızı belirtmeniz yararlı olabilir. Tam olarak yapmaya çalıştığınız şey hakkında daha iyi bir yol olabilir. – deefour

+0

Kayıt, herhangi bir şey olabilir ve bu nedenle, veritabanında başka bir şeyle karşılaştırmayı gerektirmediği sürece, yeniden yapılandırılabilir olması gerekmedikçe yeniden kullanılabilir. Bir önbellekleme sistemi için olsa da. Dolayısıyla, kayıttan önceki veya sonraki kayıt, önbelleğin silinmesi için önbelleğin 'kapsamına' giriyorsa. Önbelleğe almak istediğiniz gerçekten karmaşık sayfalar içindir, ancak güncellenmiş kayıt önbelleğin bir parçası olmadıkça zaman kaybetmek istemez. – rovermicrover

+0

aynı soru burada: http://stackoverflow.com/questions/1255815/check-if-model-instance-falls-within-named-scope-in-rails – voondo

cevap

5

ilk Eğer ilk çözüm biraz

result = self.class.where(scope).exists?(self.id) 

artırabilir, neden bakmıyorsun? senin kapsamı

class.where(:attr1 => value1, :attr2 => value2, :attr3 => value3) 

ise o zaman kapsamları basit, muhtemelen kod tekrarını önlemek istiyorsanız

result = self.attr1 == value1 and self.attr2 == value2 and self.attr3 == value3 
+0

İlk kısım çok yardımcı oluyor, nedenini bilmiyorum Bunu düşünmedim, kafamın içine kadar uzandı! İkinci kısımda sorun, yalnızca karma roketin ayarlanması için nereye yapılması gerektiğini kısıtlamak istemem. Örneğin, bir projede, girişin iki tarih arasında yayınlanmış olması ve bununla birlikte verilmiş olanı ayrıştırmak zorunda kalmamdır. Yine de bu doğru yönde düşünmeye başlamak için bana yardımcı oluyor! Teşekkürler! – rovermicrover

3

yapabilirsiniz. Çözümüm, bir örneğin kapsama ait olup olmadığını öğrenmek için model.active? numaralı telefonu aramanıza ve kapsamla eşleşen tüm kayıtları bulmak için Model.active aramanıza olanak tanır. model.active?, veritabanı sorguları içermez.

config/initializers/scope_and_method.rb bu eklemeyi düşünün:

require 'active_record/named_scope' 

module ActiveRecord::NamedScope::ClassMethods 
    def scope_and_method field, *values 
    field = field.to_sym 
    values.each do |value| 
     named_scope value.to_sym, :conditions => {field => value} 
     define_method "#{value}?" do 
     send(field.to_sym) == value 
     end 
    end 
    end 
end 

Kullanımı:

scope_and_method :state, 'active', 'inactive' 

Works o sanki:

named_scope :active, :conditions => {:state => 'active'} 
named_scope :inactive, :conditions => {:state => 'inactive'} 

def active? 
    state == 'active' 
end 

def inactive? 
    state == 'inactive' 
end 

Bu Rails 2.3 için bir çözümdür. Bu Rails 3 ve 4 için çok küçük bir ayar gerektirir. (named_scope ->scope) Yakında kontrol edeceğim.

İlgili konular