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
Eğer iki defa aradığında sorgu önbelleğe alır inanıyoruz bir örnek (kod bloğu) verir misiniz. –
Orijinal yayına daha fazla bilgi ekledim. – blim8183
Rails günlüğünün incelenmesi, sonucun önbelleğe alındığını size gösterecektir. – Sasha