我想在我目前正在进行的项目中征求您的意见。
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一样,没有多少方法调用和循环。
答案 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。