2010-06-03 44 views
1

我想在您目前正在從事的項目中獲得您的意見。類方法或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主要處理查找並且沒有太多方法調用和循環。

回答

1

我會使用類方法。命名示波器適合添加到通常傳遞給find的選項列表中。你應該儘可能簡單地使它們變得簡單,以便呼叫者能夠以一種在特定情況下有意義的方式將它們鏈接在一起,並且允許範圍被重用。

設計之外,我不知道這可以作爲一個命名範圍工作反正:

  • 作用域返回從數據庫延遲加載,直到你訪問這些代理。我不確定在計算要返回的記錄時,你會怎麼做。
  • 我不確定你可以在範圍內設置非列屬性。
  • 即使上述兩項不適用,作用域的延遲加載意味着您​​現在構建它,但可能不會加載數據,直到稍後的一段時間(可能會過時)爲止。
+0

謝謝你的回答,我不得不同意使用class method.partly,因爲我找不到一個關於named_scope的例子來操縱裏面的變量,所以在這種情況下,我返回一個可以交付的銷售訂單數組 – Hadi 2010-06-03 04:39:48

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