类方法还是named_scope?

时间:2010-06-03 04:13:06

标签: ruby-on-rails activerecord

我想在我目前正在进行的项目中征求您的意见。

class Product
  has_many :orders
end

class Order
  attr_accessor :deliverable # to contain temporary data on how many items can be delivered for this order
  belongs_to :product
end

不知怎的,我想要

Order.all_deliverable

将计算产品的数量,从订单列表中减去,直到产品为空或此产品没有订单

来说明

  Product A, quantity: 20
  Product B, quantity: 0
  Order 1, require Product A, quantity: 12
  Order 2, require Product B, quantity: 10
  Order 3, require Product A, quantity: 100

所以如果我调用Order.all_deliverable,它会给出

Order 1, deliverable:12
Order 3, deliverable: 8 #(20-12)

我一直在考虑使用named_scope,但我认为逻辑太复杂而无法放入named_scope。有什么建议吗?

all_deliverable的伪代码将是这样的: 去每个订单   找到特定产品的剩余数量   将产品扣除到最大订单量,如果产品不够,请添加最大产品   添加到订单 端

从我在网上看到的内容来看,named_scope的处理方式主要是像find一样,没有多少方法调用和循环。

2 个答案:

答案 0 :(得分:1)

我会使用类方法。命名范围适用于添加到通常传递给find的选项列表。您应该使它们尽可能简单,以便调用者可以在特定上下文中以一种有意义的方式将它们链接在一起,并允许重用范围。

除了设计之外,我不确定它是否可以作为命名范围使用:

  • 范围返回代理,延迟从数据库加载,直到您访问它们。当你计算要返回的记录时,我不确定你是怎么做的。
  • 我不确定您是否可以在范围内设置非列属性。
  • 即使上述两个项目不适用,范围的延迟加载也意味着您现在可以构建它,但可能会在以后的某个时间(当它可能过时时)加载数据。

答案 1 :(得分:0)

如果您只想操作命名范围内的事物,可以这样做:

named_scope :foobar, lambda {

  # do anything here.

  # return hash with options for the named scope
  {
     :order => whatever,
     :limit => 50
  }
}

请注意Rails 3 deprecates long-used parts of activerecord