繁体   English   中英

类方法还是named_scope?

[英]Class method or named_scope?

我想在我目前正在从事的项目中发表您的意见。

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,并且没有很多方法调用和循环。

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

除了设计,我不确定这是否仍可以用作命名范围:

  • 范围返回代理将延迟从数据库的加载,直到您访问它们为止。 我不确定在计算要返回的记录时如何处理。
  • 我不确定您可以在范围内设置非列属性。
  • 即使以上两项都不适用,延迟加载的作用域也意味着您现在就构建它,但是可能要等到以后的某个时候才加载数据,这可能会过时。

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

named_scope :foobar, lambda {

  # do anything here.

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

请注意,Rails 3 弃用了activerecord的长期使用部分

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM