ruby-on-rails - Rails 3 中的作用域与类方法

标签 ruby-on-rails ruby-on-rails-3 scope

基于 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/

相关文章:

ruby-on-rails - 如何在 Rails/Rspec 的开发和生产中检索主机 url?

RoR 中的 Javascript View

mysql - 为什么 Rails (3+) 仍然不支持存储过程?

ruby-on-rails - Sidekiq 不排队作业

javascript - 函数参数数组,如何影响reference = []或reference.concat(array2)?

c++ - 使用枚举进行类型检查——如何正确确定范围

ruby-on-rails - Ruby on Rails:如何在没有Active Record的情况下验证模型?

javascript - 获取数据时应该使用 setInterval 吗?

javascript - 限制共享变量的范围 (Javascript)

ruby-on-rails - rails : Keep params after a submit