基于 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
最佳答案
假设您正在引用 Rails 3.1,范围可能会受到模型上可能定义的默认范围的影响,而类方法则不会。
关于ruby-on-rails - Rails 3 中的作用域与类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9008597/