2012-01-25 20 views
14

Rails 3 API'sine dayanarak, bir kapsam ve bir sınıf yöntemi arasındaki fark neredeyse yok.Rails 3'te Sınıf Yöntemi ile Karşılaştırma 1

class Shipment < ActiveRecord::Base 
    def self.unshipped 
    where(:shipped => false) 
    end 
end 

Ancak

scope :unshipped, where(:shipped => false) 

aynıdır, ben bazen bunları kullanarak farklı sonuçlar alıyorum buluyorum.

Her ikisi de aynı, doğru SQL sorgusunu oluştururken, kapsam her zaman çağrıldığında doğru değerleri döndürmek gibi görünmüyor. Bu sorun, yalnızca farklı bir gönderi üzerinde de olsa iki kez aynı şekilde çağrıldığında, yöntemde ortaya çıkıyor gibi görünüyor. İkinci kez çağrıldığında, kapsamı kullanırken ilk kez aynı şeyi döndürür. Oysa sınıf yöntemini kullanırsam doğru çalışır.

Kapsam kullanılırken ortaya çıkan bir çeşit sorgu önbelleği var mı?

Düzenleme:

order.line_items.unshipped 

Yukarıdaki satır kapsamı çağrıldığını nasıl. Siparişler birçok line_items var.

generate_multiple_shipments yöntemi iki kez çağrılıyor çünkü test bir sipariş yaratıyor ve kaç tane olduğunu görmek için gönderileri üretiyor. Daha sonra siparişte bir değişiklik yapar ve gönderileri yeniden üretir. Ancak, group_by_ship_date, siparişin ilk yinelemesinden yaptığı aynı sonuçları döndürür.

def generate_multiple_shipments(order) 
    line_items_by_date = group_by_ship_date(order.line_items.unshipped) 

    line_items_by_date.keys.sort.map do |date| 
    shipment = clone_from_order(order) 
    shipment.ship_date = date 
    line_items_by_date[date].each { |line_item| shipment.line_items << line_item } 
    shipment 
    end 
end 

def group_by_ship_date(line_items)  
    hash = {} 
    line_items.each do |line_item| 
    hash[line_item.ship_date] ||= [] 
    hash[line_item.ship_date] << line_item 
    end 
    hash 
end 
+2

Eğer iki defa aradığında sorgu önbelleğe alır inanıyoruz bir örnek (kod bloğu) verir misiniz. –

+0

Orijinal yayına daha fazla bilgi ekledim. – blim8183

+0

Rails günlüğünün incelenmesi, sonucun önbelleğe alındığını size gösterecektir. – Sasha

cevap

1

Sanırım çağrınız yanlış. Sen, kapsamını yürütmek sözde sorgu yöntemi eklemek gerekir gibi all, first, last, yani .:

order.line_items.unshipped.all 

sorgu yöntemi ekleyerek kaçınılması özellikle RSpec bazı tutarsızlıklar, gözlemledik.

Test kodunuzu göndermediniz, bu yüzden tam olarak söylemek zor, ancak benim exeprience ile ilişkili kayıtları değiştirdikten sonra sorgu önbelleği her zaman için yeterince akıllı olmadığı için yeniden yüklemeniz gerekir bir değişiklik tespit edin. Derneğe true geçerek, yeniden dernek zorlayabilir ve sorgu yeniden çalıştırmak için:

order.line_items(true).unshipped.all 
+0

İlişkilendirmeyi yeniden yüklemeye zorlamak hile yapmış gibi görünüyor. Sorgu önbelleğinin bir değişiklik olup olmadığını nasıl belirlediğini, ancak en azından şu anda çalıştığı konusunda hala tam olarak net değilim. Teşekkürler! – blim8183

+0

@ blim8183 Bunun cevabını da bilmiyorum, ama bunun bir tasarım ticareti olabileceğinden şüpheleniyorum. Yeniden yükleme sizin için işe yaradı. –

1

Eğer Rails 3.1 başvuran, bir kapsam sınıf yöntemi olmayacak oysa modelinize tanımlanabilir varsayılan kapsam etkilenebilir olduğunu varsayarsak.

İlgili konular