2010-06-01 71 views
1

我有產品和SalesOrder模型(簡化,1個sales_order的1個產品)這種類型的計算是放在模型還是控制器中?

Product 
has_many :sales_orders 

SalesOrder 
belongs_to :product 

pa = Product A #2000 
so1 = SalesOrder #1 order product A #1000, date:yesterday 
so2 = SalesOrder #2 order product A #999, date:yesterday 
so3 = SalesOrder #3 order product A #1000, date:now 

基於日期,pa.find_sales_orders_that_can_be_delivered會給:

SalesOrder #1 order product A #1000, date:yesterday 
SalesOrder #2 order product A #999, date:yesterday 
SalesOrder #3 order product A #1, date:now <-- the newest 

的問題是:find_sales_orders_that_can_be_delivered應該在模型中? 我可以在控制器中做到這一點。

和一般問題是:模型中發生了什麼以及Controller中發生了什麼。

謝謝

+0

你能格式化你的代碼嗎? – Ceilingfish 2010-06-01 10:13:17

+0

當然,對於修復它的麻煩抱歉。 – Hadi 2010-06-01 10:28:15

回答

1

當然,請將此邏輯放在控制器外面。控制者應該將商業決策交給模型。這是有一個MVC框架開始的整個觀點。

此外,我會把邏輯放在SalesOrder上,而不是產品 - 它看起來像一個named_scope的好候選人。也許這樣的事情(和牢記,我不知道您的具體規則是什麼計算的交付訂單的日期):

named_scope :deliverable, lambda {{ :conditions => ["date < ?", Date.today] }} 

包裝用拉姆達可以確保:條件是實時評估,使用當前日期值。很明顯:條件取決於您的業務規則對於可交付訂單而言,但您明白了。這將使一個不錯的方法鏈,如:

pa.sales_orders.deliverable 

現在你可以重新使用邏輯的地方有一個的has_many:sales_orders。

+0

named_scope看起來不錯,但我懷疑它是可行的,因爲可交付成果需要查看整個數據庫,比較產品庫存(並且實際上減少它的值),因爲找到了具有所需項目的銷售訂單。那麼,爲了簡單起見,它需要在銷售訂單中分配變量,可以交付多少這種產品。我希望你明白我的意思。 – Hadi 2010-06-03 02:56:13

3

很簡單:

微型控制器,高脂模型

在模型中的所有。如果你把你的控制器,你不能在不同的部分重複使用它。

  • Rake任務
  • 其他控制器
  • 控制檯

所以把所有可能的模型。在控制器中,你只需要使用session/cookie進行操作。重定向部分和使用哪個視圖。

+0

我明白了。謝謝。 – Hadi 2010-06-01 10:54:04

0

我認爲這應該在模型中。通常,當我想要決定控制器或模型中是否發生了某些事情時,我會問自己:「如果以另一種方式訪問​​數據,我需要這個嗎?」。

例如,如果數據正在被另一個控制器(如管理工具)訪問,我是否仍想使用該功能?我仍然需要它嗎?然後它與模型有關,而不是控制器。

另一個例子:如果數據正在被另一個應用程序訪問,例如桌面應用程序,我是否還想要這個功能?和之前一樣。

相關問題