Основываясь на Rails 3 API, разница между областью видимости и методом класса практически отсутствует.
class Shipment < ActiveRecord::Base
def self.unshipped
where(:shipped => false)
end
end
совпадает с
scope :unshipped, where(:shipped => false)
Однако я обнаружил, что иногда получаю разные результаты, используя их.
Хотя оба они генерируют один и тот же правильный запрос SQL, область видимости не всегда возвращает правильные значения при вызове. Похоже, что эта проблема возникает только тогда, когда она вызывается одним и тем же способом дважды, хотя и при другой доставке, в методе. Когда он вызывается во второй раз, он возвращает то же самое, что и в первый раз. Принимая во внимание, что если я использую метод класса, он работает правильно.
Существует ли какое-либо кэширование запросов при использовании области действия?
Edit:
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