W oparciu o API Rails 3 różnica między metodą zakresu i klasy praktycznie nie istnieje.Scope vs Class Method in Rails 3
class Shipment < ActiveRecord::Base
def self.unshipped
where(:shipped => false)
end
end
jest taka sama jak
scope :unshipped, where(:shipped => false)
Jednak jestem stwierdzenia, że ja czasem coraz różne rezultaty ich stosowania.
Podczas gdy oba generują takie same, poprawne zapytanie SQL, zasięg nie zawsze wydaje się zwracać prawidłowe wartości po wywołaniu. Wygląda na to, że ten problem występuje tylko wtedy, gdy w metodzie nazywany jest tak samo dwukrotnie, chociaż na innej przesyłce. Za drugim razem, gdy się go nazywa, przy użyciu zakresu zwraca to samo, co za pierwszym razem. Natomiast jeśli używam metody klasy, działa poprawnie.
Czy istnieje jakieś buforowanie zapytań, które występuje podczas korzystania z zakresu?
Edit:
order.line_items.unshipped
Linia powyżej sposób zakres jest nazywany. Zamówienia mają wiele line_items.
Metoda generate_multiple_shipments jest wywoływana dwa razy, ponieważ test tworzy zamówienie i generuje przesyłki, aby sprawdzić ich liczbę. Następnie dokonuje zmiany w zamówieniu i regeneruje przesyłki. Jednak group_by_ship_date zwraca takie same wyniki, jakie wykonał od pierwszej iteracji zamówienia.
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
Może Pan podać przykład (fragment kodu) gdzie można sądzić kwerenda pobiera buforowane kiedy wywoływana dwukrotnie. –
Dodałem więcej informacji do pierwotnego wpisu. – blim8183
Sprawdzanie dziennika szyn pokazuje, czy wynik jest buforowany. – Sasha