2017-02-14 41 views
0

我開始構建我的第一個rails應用程序,並且我已經擁有STI(管理員,員工,公衆和代表均從用戶模型繼承)的用戶模型。 但現在我想爲代表性的子類添加特定的列(地址,狀態,電話),但我無法直接將子遷移應用於子類模型。rails STI:子類的特定屬性

  • 第一解決方案是增加這些列恩用戶模型,但我不知道如何限制日接取只representant子
  • 第二個解決方案是創建一個單獨的接觸表,然後使用多態關聯(我想與其他模型關聯)並添加屬性
  • 我的問題是什麼是這種情況下的最佳解決方案?如果有更好的解決方案?

感謝

回答

3

希望你們搞好

我認爲第二個方案是更好然後第一。

原因: 1)如果這個所有字段都是可選的,那麼它將創建空值記錄,但在第二種情況下,如果所有字段都是可選的,那麼不會創建記錄,因此不需要任何條目。

2)將來有要求添加或使用此字段到其他模型,那麼你可以通過多態關聯容易做到。

+0

謝謝,我會使用多態關聯選項,但我會等一段時間,以防有人有另一個新的選項建議 –

+0

是啊當然..... –

+0

歡迎您.. –

0

這聽起來像你在這種情況下濫用STI的想法。一般規則是,您可能對不同的子模型和不同的行爲有不同的關聯,但是您始終擁有所有子模型使用的所有表列。

您爲什麼想要使用STI的整個想法是所有模型都包含相同的數據結構,但可能有不同的行爲。在你的情況下,我會建議使用關聯(如你自己建議的那樣),然後在子模型中添加has_one/has_many,這會限制繼承鏈中的關聯範圍。

無法在不修補ApplicationRecord的情況下將列限制爲僅某些子模型。但無論如何,即使您設法引入了這種行爲的補丁,您的數據庫表仍然會包含所有表的所有列,從而導致更大的數據庫表,這是由於列中有半空,增加的大小和減少性能。

我希望能回答你的問題。

+0

我只是提到這個定義繼承https://www.postgresql.org/docs/9.5/static/ddl-inherit.html perhaprs rails有不同於PostgreSQL的繼承定義 –

+0

和CTI呢? http://sequel.jeremyevans.net/rdoc-plugins/classes/Sequel/Plugins/ClassTableInheritance.html –

+0

但據我所知,你正在談論的是STI的Rails實現,對嗎?你提出的例子是不同的概念。 – Kkulikovskis