2013-12-10 103 views
4

我在STI,多態關聯或類型表之間撕裂。我已經有一個帶有以下字段的單位表:rails - 多態關聯或單表繼承

name 
account_id 
speed_limit 
is_speeding 
activation_state 
unit_status_id 

實際上有三種不同的單位:gps單位,石油單位和冰箱單位。當用戶登錄時,其網頁有條件地根據它是哪個單元而改變。這三個單位都有一個帳戶,activation_state和unit_status_id等字段。但只有GPS單位有一個speeding_limit或is_speeding領域。

我應該使用多態關聯:

class Unit 
    belongs_to :unitable, :polymorphic => true 
end 

class RefrigeratorUnit < ActiveRecord::Base 
    has_one :units, as: => :unitable 
end 

class OilUnit < ActiveRecord::Base 
    has_one :units, as: => :unitable 
end 

class GpsUnit < ActiveRecord::Base 
    has_one :units, as: => :unitable 
end 

或者我應該使用單表繼承?

class Unit < ActiveRecord::Base 
end 

class GpsUnit < Unit 
end 

class RefrigeratorUnit < Unit 
end 

class OilUnit < Unit 
end 

起初我傾向於STI,但冰箱和油單位沒有速度的限制,這意味着他們將永遠是空values.So我開始實施態關聯,但後來意識到GPS單元,油壓單元,否則冰箱單位將永遠不會擁有has_many單位。換句話說,它將永遠是一個關係,並且當用戶創建一個gps單元時,例如,一個單元也將被創建。這似乎有點多餘。所以我被撕裂了。

回答

2

我會說你有它倒退 - 有三種非常不同的單位類型,所以可能應該有三個不同的單位類 - GpsUnit,OilUnit,FridgeUnit。

然後它依賴 - 如果配置文件只有一個單元,然後簡介:

belongs_to :unit, :polymorphic => true 

如果配置文件可以有多個單位,或單位有很多共同的行爲,那麼STI是答案,大概。

+0

確實沒有「檔案」。這只是一個糟糕的命名。真的有GpsUnit,OilUnit和RefrigeratorUnit。爲什麼你更喜歡STI多態關聯?這真是我的問題。 – JohnMerlino

+1

我其實不這樣做,只是因爲我無法完全理解這裏的模型。 – DeeY

+0

我編輯了我的問題。沒有配置文件。我完全刪除了配置文件的任何參考。這裏只有三個對象:gpsunit,refrigeraterunit和oilunit。他們的大多數屬性都是一樣的。但是,gpsunit加快了其他人沒有的屬性。我認爲多態關聯更靈活,因爲它允許您創建具有自己列的不同表格。但是,當用戶創建一個單元時,我將不得不在單位表和gpsunits表中插入一條記錄,例如,這看起來沒有必要。所以這就是爲什麼我想到STI。 – JohnMerlino