2015-05-12 126 views
1

我們正在嘗試爲項目建立最佳實踐,並且我們正在討論應該在何處放置SQL和ActiveRecord方法。Ruby on Rails ActiveRecord約定

我的理解是,你想保持儘可能多的邏輯控制器儘可能。我認爲我們同意屬於模型的複雜SQL查詢,但我們不同意簡單的AR方法應該在哪裏存在,無論是在控制器還是在模型中。

因此,與喜歡的東西簡單化:

client = Client.find(10) 

會是理想的生活在一個模型或控制器?我明白它可能沒有太大的區別,答案也沒有關係,但對這個問題的任何洞察力都會很大。

+3

'client = Client.find(10)'是一個相當簡單的操作,並且有一點不在上下文中,所以我會說它可能會進入控制器或模型,具體取決於它的完成原因。沒有其他指導,我可能會說控制器。約定是控制器和視圖在代碼上很簡單,代碼在模型中(並且在助手中查看幫助代碼),但它是一個*規範*(並非絕對規則),這是有原因的,很多代碼與排序,篩選和處理與模型相關的數據有關。控制器可以有*一些*代碼。:) – lurker

+1

這是一個討論,源自博客閱讀:「複雜的查詢(即比簡單的查找更復雜);一般來說,你不應該使用where方法或任何其他查詢構建方法喜歡它,在模型類本身之外「。 我剛纔意識到他說的發現可以在控制器中使用,那麼Client.where(「first_name ='Carly'」) 我認爲這應該是在控制器之外? – CarlyL

+3

對於'Client.where(「first_name ='Carly'」)',我仍然會說*它取決於*(在上下文中)。 :) – lurker

回答

1

對此沒有一個很好的答案,我有一種感覺,這可能會因此而關閉,但無論如何,這裏無論如何。

Client.find(10)Client.where("first_name='Carly'")與您所能做的一樣簡單。你根本無法用模型方法替換第一個。第二我想你可以做一個search方法,但這可能爲時過早。

我認爲這些文章的一點是,你不希望在你的控制器是這樣的:

Client.where("created_at > X").where("some_flag = true").order('created_at DESC')

這是一個名爲範圍非常明確的候選人(或他們夫婦)。

這就是說有些時候我會把它留在我的控制器中,因爲它非常專用於控制器,並且不會在其他任何地方使用,因此在干擾它的時候沒有太多的意義。

然而,大多數時候當你開始這樣做時,你會意識到有一些常見的功能可以提取到你的模型中,所以你可以在別處使用它。

+0

我認爲這是我們所尋找的核心。感謝您花時間回答! – CarlyL

1

除了類別scope s,您還可以考慮使用查找器模型,該模型從模型和控制器中提取查詢。請看Gitlab handles it

+0

謝謝Andrey,我以前沒有聽說過發現者模型。這是一個有趣的概念,我很欣賞反饋。 – CarlyL

1

我真的認爲這裏的「核心」原則是DRY和KISS。

如果您有幾個控制器所需的查詢相對較長(幾個where子句,join s等),請將其作爲範圍提取。

如果您有一個相當冗長的查詢,看似壓倒了整個控制器方法,您應該將其作爲範圍提取。

+0

謝謝藝術。我認爲,我們應該如何處理簡單和非簡單的ActiveRecord方法並抽象出範圍。 – CarlyL

+0

不客氣@CarlyL。很高興我能幫上忙。祝你好運! –

相關問題