基于Rails 3 API,范围和类方法之间的差异几乎不存在.
- 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