2012-05-02 48 views
4

我對MVC的理解是SQL(或任何與持久相關的)查詢只能在模型/控制器對象中執行。因此,Rails 3 documentation about Controllers指出:查詢在Rails 3視圖中可以接受嗎?

[控制器]使模型數據可用於視圖,以便它可以將該數據顯示給用戶。

然而,該文檔還具有使用queries directly in View (HTML helper) code的例子:

select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }) 
# Note the model query -----^ 

在Rails 3,是通常可接受的,以查看執行查詢或者是有令人信服的理由嚴格委派這種查詢到模型或控制器對象?文件是否僅僅是示範性的,還是它是一個最佳實踐的例證?

回答

6

我認爲這只是示範,並不是一個很好的例子。它足夠接近我們可以在PHP中找到的SQL Spahettis代碼。

我現在正在閱讀Rails anti-patterns book,他們建議對模型中的所有查詢進行範圍劃定。然後控制器將訪問模型中定義的方法,將結果公開給視圖。

但是,如果你不注意,你可以很快找到自己的胖模特,爲了避免你可以使用Named scopes這對這種模式有很大的幫助。另一個需要注意的關鍵規則是應用於Rails的Law of Demeter意味着一個模型不應該太瞭解其他模型的實現細節。因此,如果存在與關聯模型相關的查詢,您應該在此關聯模型中進行範圍。

最後,以下article(由Jamis Buck編寫)(Skinny Controller,Fat Model)是一篇很好的關於這個主題的文章。

0

在Views中執行查詢通常是不可接受的,即使它們非常簡單。爲了避免讓控制器變得沉重,一個好的做法(如文檔所述)是創建一個Helper並將查詢放在那裏。

當然,如果你想重用查詢,最好把它放在模型中,也許使用範圍。

+1

但是,在視圖中主要(完全?)不是使用助手嗎?如果我們把一個查詢放在助手中,那麼和在View中做查詢不是一回事嗎? – maerics

+0

我明白了,我的觀點是避免直接把它放在視圖中,並證明文件是正確的。我用來從單個表a.i中提取簡單的數據。創建包含項目列表的組合框的助手。 –

相關問題