2010-08-17 58 views
13

我目前正在研究Rails 3應用程序,它看起來可能需要爲幾個模型使用類表繼承。Rails中的類表繼承3

這是一個簡單的例子。

我有一個名爲Person的類,它具有常用屬性,如名稱,電子郵件和密碼,這些屬性對於應用程序中所有類型的用戶都是通用的,並用於身份驗證。

Person有兩個子類(或兩種類型的人...),Driver和Passenger。這兩個子類都共享Person的通用屬性,但它們具有特定的附加屬性,這些屬性對於它們自己是唯一的。 (例如司機可以有許多車輛和執照,但乘客不會)

我會如何實施CTI的這種情況?我一直在尋找在這裏提供了一個示例:

http://rhnh.net/2010/08/15/class-table-inheritance-and-eager-loading

不過,這並不瞭解如何從司機或乘客對象訪問一個人的共同屬性推測,我有點迷茫那。

尤其想什麼,我知道的是:

如果我更新驅動程序的屬性,我怎麼能輕鬆地訪問和更新父人表中的相關屬性?我是否必須掛鉤after_save回調,並分離出哪些屬性更新去哪裏?或者有更好的方法來解決這個問題嗎?

+0

我應該補充一點,這是我的應用程序實際發生的簡化示例。我確定我需要在我的情況下實現類表繼承,單表繼承不是最好的方式。 – 2010-08-18 00:24:39

+0

我對我在我的問題中提到的博客發表了評論,作者慷慨地提供了一種實現此方法的示例:http://rhnh.net/2010/08/17/updating-class-table-inheritance-表(You rock Xavier!) – 2010-09-14 05:21:50

回答

5

爲什麼不使用單表繼承?例如:

class Person < ActiveRecord::Base 
    # some common code here 
end 

class Driver < Person 
    # Driver code 
end 

class Passenger < Person 
    # Passenger code 
end 

這樣你就會有一個共同的階級的人,再加上從它

+13

注意:OP詢問如何使用類表繼承,而不是單表繼承。 – 2010-08-18 00:15:31

+21

有時候人們會問不正確的問題,我只是回答了他的問題的一個可能的解決方案。 – 2010-08-18 08:09:15

+9

然後它應該被建議作爲評論。 – EdMelo 2011-11-26 00:35:08

4

我使用的是類表繼承的插件,它的工作以及衍生出的兩個特定的類,http://github.com/brunofrank/class-table-inheritance

+0

感謝您的提示,我會查看插件! – 2010-10-21 22:21:04

+4

不是最好的解決方案,導致不能正常工作與postgres(即,不要使用這個,如果你打算使用heroku與postgres) – standup75 2011-03-02 16:14:19

2

我最近分叉了一個有希望的項目來在Rails中實現多表繼承和類繼承。我花了幾天的時間對它進行快速開發,修復,評論和編寫文檔,並將它重新發布爲CITIER(Rails的類繼承和表繼承嵌入)。

我想你可以將它與上面的答案結合起來?

考慮給它一看:http://peterhamilton.github.com/citier

我看着像類表繼承回購方案,但是這是更清潔和更合理的國際海事組織。

它還支持主要的SQL語言SQLite,MySQL,PostgreSQL,可能更多,但我沒有測試過它們。

+0

這個寶石似乎是三個功能中最完整的。請問您是否查看過性能比較?還與太陽黑子集成(因爲使用數據庫視圖)? – lulalala 2012-03-23 15:11:25

+0

偉大的工程...但我們遇到了很多Herku的問題。它不喜歡錶格視圖,尤其是在推/拉數據庫時。最終刪除它。 – Ricky 2012-03-27 19:05:58

7

也有一個插件「acts_as_relation」要做到這一點,
https://github.com/hzamani/acts_as_relation/

你的情況

代碼將是這樣的:

class Driver < ActiveRecord::Base 
    acts_as :person 
end 

class Passenger < ActiveRecord::Base 
    acts_as :person 
end 

不要忘記person_typeperson_id列添加到persons表。
現在Drive和Passenger都繼承Person屬性,驗證和方法。