我正在開發一個用戶可以擁有多個客戶端的項目。那些客戶可以是Person或Business類型。Rails STI設計問題
我傾向於使用STI的想法,但我不確定這是否是正確的方式,因爲我的模型不會共享相同的屬性。
例如,一個企業有一個legal_form,其中一個人可能有婚姻狀態。
在這種特殊情況下可以使用STI還是(第二個問題)有沒有辦法讓rails爲每種類型使用不同的表格。
我正在開發一個用戶可以擁有多個客戶端的項目。那些客戶可以是Person或Business類型。Rails STI設計問題
我傾向於使用STI的想法,但我不確定這是否是正確的方式,因爲我的模型不會共享相同的屬性。
例如,一個企業有一個legal_form,其中一個人可能有婚姻狀態。
在這種特殊情況下可以使用STI還是(第二個問題)有沒有辦法讓rails爲每種類型使用不同的表格。
STI就像紅寶石般的繼承。你可以使用它,如果你有父和孩子和他們共享很多屬性和數據。如果Person
和Business
分享很多,你可以使用它。否則我建議你使用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
我don't really like STI和我建議您嘗試使用多態關聯。
與STI的一個常見問題
與STI一個常見的問題是,隨着時間的推移,更多類型被添加到 該表,它的增長越來越多列,並在記錄 表彼此的共同點越來越少。每種類型的 記錄都使用表格列的某些子集,而沒有一個使用它們的所有 ,因此最終得到的表格非常稀少。這些類型 爲對方創造成本:當您查詢文章時,您必須記得過濾掉所有其他類型的值並且只選擇 選擇與文章相關的列,否則支付巨大的成本 成本。您重現了數據庫爲您所做的大量工作,如果您只在每個數據類型的表中包含 。
假設我會去多態協會將本是正確的
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
我曾經考慮過使用多態關聯,但我不我知道該如何組織它。我已經創建了3個模型(包含3個表格)Client,Business和Person。我的最終目標是擁有一個客戶控制器,我可以從中調用所有客戶的名單,無論他們是商業還是個人。 – makabde
@makabde是的,哪裏有問題? :) – Arsen