2010-07-10 73 views
0

我有一個用戶表和我新創建的老師。老師是用戶的子類,所以,我使用腳手架生成器來生成老師表,比我修改模型做老師是用戶的子類。畢竟,我做了一個db:migrate。然後,我去Rails的單表繼承如何工作?

http://localhost:3000/teachers/new

它顯示了一個錯誤:

undefined method `teacherSalary' for #<Teacher:0x103331900> 

所以,我的問題是我做了什麼錯?我想爲用戶註冊創建一個頁面,用戶只能是一名教師/學生。但我不能添加一個老師的記錄......而且,我去

http://localhost:3000/users/new

我想有一個組合框,允許用戶註冊自己的用戶是一個「老師」或「學生」。但一切似乎都不像我預期的那樣工作。我需要做什麼?非常感謝您的幫助。

回答

2

在您的數據庫中,您應該有一個稱爲用戶的表。此表應該有一個字符串列,默認情況下稱爲類型。如果您爲此列使用其他名稱,則必須使用self.inheritance_column = "column_name"

手動設置繼承列名稱在您的應用程序中,您有三種模型,用戶,學生和教師。像往常一樣用戶從ActiveRecord :: Base繼承,Student和Teacher都從User繼承。

然後,您應該能夠實例化新的Teacher和Student對象。在內部,通過將模型名稱寫入用戶表的類型字段,然後在使用Student.find時,它向SQL添加一個子句,以僅返回類型爲'Student'的行。

您可以將共享行爲添加到用戶類,例如驗證等,然後向繼承的類添加其他行爲。

有關STI如何工作的更完整說明可在Martin Fowlers Book(Patterns of Enterprise Application Architecture)中找到。

0

因爲你在這裏有什麼,我不確定STI是否是最好的選擇。當存在類似繼承的面向對象時,通常應使用STI,並且模型具有相同的屬性但行爲不同。在你的情況下,教師和學生可以肯定有幾個共同的歸因,但他們也必然有不同的。
您可能也想嘗試多態關聯。

2

我發現這個定義真的很方便:STI意味着一個表包含多個模型的數據,通常通過「類型」列進行區分。 (「用戶」表包含模型「教師」,「學生」,「員工」,「助理」等的數據) 保持同一表格中的相似模型而不是創建新模型

多態關聯意味着一個模型可以與多個其他模型關聯(註釋可以屬於帖子,圖像,文件,用戶類型...) 爲了防止外鍵衝突,該關聯被重複爲* _id和* _type列而不是隻有* _id。