Въз основа на API на Rails 3, разликата между обхват и метод на клас почти не съществува.
class Shipment < ActiveRecord::Base
def self.unshipped
where(:shipped => false)
end
end
е същото като
scope :unshipped, where(:shipped => false)
Откривам обаче, че понякога получавам различни резултати, използвайки ги.
Въпреки че и двете генерират една и съща, правилна SQL заявка, обхватът не винаги изглежда да връща правилните стойности при извикване. Изглежда, че този проблем възниква само когато се извика по същия начин два пъти, макар и на различна пратка, в метода. При второто извикване, когато използва обхват, той връща същото нещо, което направи първия път. Докато, ако използвам метода на класа, той работи правилно.
Има ли някакъв вид кеширане на заявки, което се случва при използване на обхват?
Редактиране:
order.line_items.unshipped
Горният ред е как се извиква обхватът. Поръчките имат много line_items.
Методът generate_multiple_shipments се извиква два пъти, защото тестът създава поръчка и генерира пратките, за да види колко са. След това прави промяна в поръчката и регенерира пратките. Group_by_ship_date обаче връща същите резултати, както от първата итерация на поръчката.
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