2013-03-05 70 views
2

我有一個模型和表格,我認爲它非常適合STI。我的表叫做Finances,有兩種類型:收入和支出。除了type還有其他三列:descriptionamountdate替代Rails單表繼承(STI)?

我在Rails中使用STI越來越緊張,因爲它需要一些黑客攻擊。我對Rails破解代碼太陌生了。即使它有效,我也不明白。這似乎很危險。

我的問題是,如果我不使用STI,如何設置我的模型,控制器和視圖?任何將我的模型中的項目分組的最佳實踐?或者在設置視圖之前只做Finances.where("type = 'Income'")

編輯:我做了一個gist來顯示我正在使用的代碼。當我運行它,我得到的錯誤:

undefined method `incomes_path' for #<#<Class:0x007fbc95f60b40>:0x007fbc93883220> 

回答

4

首先,使用STI是Rails的標準,所以沒有必要感到緊張。並且不需要「黑客」。它已被許多開發人員非常成功地使用。正如你所看到的,你可以在網上找到教程和一般信息。

如果在另一方面,你決定不使用STI,你必須使用
(一)完全獨立的模型與自己的表的選擇,這將導致很多重複的代碼,或
(b)創建自定義「類似STI的」行爲。 第二個選項至少可以讓你更多地瞭解Rails。

例如,在你的Finances模型,你會定義範圍incomes,像

scope :incomes, where(:type => 'Income') 

那麼你可以做Finances.incomes

然後,如果您有隻適用於其中一種類型的方法,則應該檢查所有記錄是否爲所需的類型。

就我個人而言,我會建議你使用STI。您可以免費獲得許多功能,並且您正在使用Rails的方式。 想象一下,例如,其他開發人員正在閱讀您的代碼,他們會問自己,爲什麼不使用STI,將它歸咎於無知並且 - 如果需要的話 - 使用STI重構它。

+0

好的,你說服我繼續推進性傳播疾病。我認爲我有模型部分,但在Controller或View中使用它時感到困惑。如果你不介意,我想今天晚些時候在Github上發佈一些代碼,這樣你就可以看到我出錯的地方。 – Casey 2013-03-05 17:20:32

+1

您也可以將其發佈在http://codereview.stackexchange上。com – kr1 2013-03-05 18:43:48

+0

嘿抱歉殭屍帖子,但你認爲@ kr1多態繼承?僅供參考,我正在與醫生和醫院,兩個不同的用戶羣組開發應用程序。你用過這些還是STI還是Rails的方式? – 2014-04-03 20:22:15

0

STI是最好的,如果你使用的繼承結構是這樣的。您並不需要使用Finances.where("type = 'Income'")。您可以簡單地使用Income.all。看到這些帖子,如果他們幫助你。 http://www.therailworld.com/posts/18-Single-Table-Inheritance-with-Rails http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/

+0

但是如何使用form_for? http://henrik.nyh.se/2012/08/rails-sti-and-form-for/我在這篇文章中發現我需要使用object.becomes來使它與STI協同工作。作者在文章結尾說這種方法很脆弱,所以一定要測試一下。 – Casey 2013-03-05 05:21:28