2011-06-21 63 views
22

如果我有一個用戶,我想使不同類型的用戶,說只是普通用戶,只有一個電子郵件,誰擁有一個網站領域的用戶,我將如何讓用戶繼承一切從用戶只是一個補充領域?Rails的型號繼承

回答

26

您將需要創建一個表的所有字段,以及指定類型列。 即

create_table :users do |t| 
    t.string :email 
    t.string :website 
    t.string :type 
end 

然後你就可以擁有類,如

Class User < ActiveRecord::Base 

Class Subscriber < User 

訂戶將繼承一切從用戶模式。類型列在那裏,以便您可以區分不同的模型。例如使用

Subscriber.all 

只會得到用戶,在這裏,如果你沒有使用「類型」一欄也將找到的用戶太多。

+20

OP:這就是所謂的「單表繼承」或「STI」。所以谷歌,以獲得更多的信息,如果你需要它的工作原理。 – Pavling

+4

在做了很多關於這個主題的搜索之後,有些人似乎更喜歡在模型之間的數據不同時使用多態關聯。這可以避免讓一個表有很多空字段。 我發現這個railscast有所幫助:http://railscasts.com/episodes/394-sti-and-polymorphic-associations。 – rogerkk

+0

類型欄應該有什麼實際值? –

13

你想single table inheritance,在由Alex賴斯納的鏈接描述。 STI使用單個表格來表示從基本模型繼承的多個模型。在Rails世界中,數據庫模式有一個列,它指定了行所表示的模型的類型。添加在數據庫遷移名爲type列有Rails的推斷表使用STI,但如果你指定在數據模型的名稱(見class method 'inheritance_column')列可以是任意的名字。請注意,這使得type成爲保留字。

+2

這已經被破壞。我想正確的鏈接是[http://www.alexreisner.com/code/single-table-inheritance-in-rails](http://www.alexreisner.com/code/single-table-inheritance-in-rails ) –

+0

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – Luke

+1

@Luke:只要「單表繼承」是答案,那不完全是鏈接。 –