2015-09-20 48 views
1

我正在開發一個用戶可以擁有多個客戶端的項目。那些客戶可以是Person或Business類型。Rails STI設計問題

我傾向於使用STI的想法,但我不確定這是否是正確的方式,因爲我的模型不會共享相同的屬性。

例如,一個企業有一個legal_form,其中一個人可能有婚姻狀態。

在這種特殊情況下可以使用STI還是(第二個問題)有沒有辦法讓rails爲每種類型使用不同的表格。

回答

1

STI就像紅寶石般的繼承。你可以使用它,如果你有孩子和他們共享很多屬性和數據。如果PersonBusiness分享很多,你可以使用它。否則我建議你使用Polymorphic Associations

一個更高級的轉折協會是多態 關聯。通過多態關聯,在單個關聯上,模型可以比其他模型更多地屬於 。例如,您可能有 的圖片模型屬於員工模型或 產品模型。下面是如何可以這樣宣稱:

class Picture < ActiveRecord::Base 
    belongs_to :imageable, polymorphic: true 
end 

class Employee < ActiveRecord::Base 
    has_many :pictures, as: :imageable 
end 

class Product < ActiveRecord::Base 
    has_many :pictures, as: :imageable 
end 

enter image description here

don't really like STI和我建議您嘗試使用多態關聯。

與STI的一個常見問題

與STI一個常見的問題是,隨着時間的推移,更多類型被添加到 該表,它的增長越來越多列,並在記錄 表彼此的共同點越來越少。每種類型的 記錄都使用表格列的某些子集,而沒有一個使用它們的所有 ,因此最終得到的表格非常稀少。這些類型 爲對方創造成本:當您查詢文章時,您必須記得過濾掉所有其他類型的值並且只選擇 選擇與文章相關的列,否則支付巨大的成本 成本。您重現了數據庫爲您所做的大量工作,如果您只在每個數據類型的表中包含 。

+0

我曾經考慮過使用多態關聯,但我不我知道該如何組織它。我已經創建了3個模型(包含3個表格)Client,Business和Person。我的最終目標是擁有一個客戶控制器,我可以從中調用所有客戶的名單,無論他們是商業還是個人。 – makabde

+0

@makabde是的,哪裏有問題? :) – Arsen

0

假設我會去多態協會將本是正確的

class Client < ActiveRecord::Base 
    belongs_to :cliental, polymorphic: true 
end 

class Business < ActionRecord::Base 
    # Here I am using has_one because I do not want to have duplicates 
    has_one :client, as: :cliental 
end 

class Person < ActionRecord::Base 
    # Here I am using has_one because I do not want to have duplicates 
    has_one :client, as: :cliental 
end 

後來我想做到以下幾點

class User < ActiveRecord::Base 
    has_many clients 
    has_many businesses, through: :client 
    has_many people, through: :client 
end