基於Rails 3 API,範圍和類方法之間的差異幾乎不存在。Rails 3中的範圍與類方法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
能否請你提供,你相信所謂的兩次當查詢被緩存的例子(代碼段)。 –
我已將更多信息添加到原始帖子。 – blim8183
檢查Rails日誌會告訴你結果是否被緩存。 – Sasha