ruby-on-rails – 范围vs Rails中的Class方法3

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 范围vs Rails中的Class方法3前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
基于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

解决方法

我认为你的调用是不正确的.您应该添加所谓的查询方法来执行范围,例如all,first,last,即:
order.line_items.unshipped.all

我观察到一些不一致,特别是在rspec中,这是通过添加查询方法来避免的.

你没有发布你的测试代码,所以很难准确地说,但我很高兴的是,在修改关联的记录之后,你必须强制重新加载,因为查询缓存并不总是足够聪明地检测到一个变化.通过传递给关联,您可以强制重新加载关联并重新运行查询

order.line_items(true).unshipped.all

猜你在找的Ruby相关文章