2010-05-03 65 views
2

越來越多我將我所有的代碼放在有關MVC的模型和幫助程序中。Rails:幫助程序和模型 - 在哪裏組織代碼

但是,有時我不確定在哪裏組織代碼。應該進入模型還是應該成爲助手。各有哪些好處?是更快還是相同?我聽說過有關所有模型緩存的內容,因此看起來好像是將大部分代碼放在一個更好的位置。

例如這裏是一個模型或輔助性工作的場景:

def status 
    if self.purchased 
    "Purchased" 
    elsif self.confirmed 
    "Confirmed" 
    elsif self.reserved 
    "Reserved" 
    else 
    "Pending" 
    end 

我不需要,因爲有布爾字段此狀態保存在數據庫中購買,確認和保留。那麼爲什麼把它放在模型中,或者爲什麼把它放到幫助器中呢?

因此,我不確定將代碼放入模型或輔助程序中獲得的最佳做法或好處,如果它可以同時存在。

回答

5

你具體的例子是包括意義上的業務規則,如果模型的實例都購買並確認,然後適當的狀態爲「購買」而不是「證實」

所以,在你的榜樣,我因爲它正在編寫您的應用程序業務規則之一,所以必須將該方法放入模型中。

一個不同的例子:

def status_string 
    case status 
    when 0: "Purchased" 
    when 1: "Confirmed" 
    else 
     "Pending" 
    end 
end 

在這種情況下,STATUS_STRING方法可以合理地在一個視圖助手或模型中定義要麼 - 它無關,與任何業務規則,它正在改變表示的價值。我把它放在模型中,因爲我傾向於只將與html相關的sw放到View Helpers中。但根據您的國際化計劃,類似的方法可能會更好地放置在View Helper中。

View Helper的一個很好的例子是將日期時間值轉換爲應用程序的標準表示形式的應用程序範圍的方法。例如

# application_helper.rb 
def date_long_s(d) 
    d.strftime("%A, %b *%d, %Y *%I:%M %p") 
end 
+0

+1 - 「我肯定會把這個方法放在模型中,因爲它正在編寫您的應用程序業務規則之一。」 – 2010-05-03 04:06:43

+0

威士忌所說的另一個+1。 – Anurag 2010-06-18 02:12:32

3

這真的很主觀,我同意,有時候不清楚是否屬於模型或幫手。

例如:

# using model 
status ? status.nice_name : "Pending" 
# using helper 
nice_name(status) 

這裏的幫手明顯的優勢是,它能夠處理零對象優雅地保持清潔的意見。缺點是代碼現在位於遠離模型的不同位置

性能明智,您不會看到使用助手和模型之間的任何顯着差異。數據庫往返拉動狀態對象更有可能成爲瓶頸。

0

我在這種情況下使用常量哈希。

哈希在模型文件中定義這樣

STATUS = { 
1 => "Pending", 
2 => "Confirmed" 
} 

我也是這樣每個狀態聲明常量。

ST_PENDING = 1 

聲明這在編寫查詢時很有用。例如,

MyModel.all(:status=>ST_PENDING) 

數據庫表中的狀態字段是數字。所以在打印時,我只是簡單地使用它。

MyModel::STATUS[obj.status]