2011-12-01 96 views
0

我見過的大多數繼承問題都假設子類具有與超類不同的屬性。例如,Person可能是超級類,而Driver是子類,其中Driver已包含所有內容Person加上了license_type字段。Rails 3.1沒有表繼承的模型繼承

我在問一個稍微不同的問題。我有一個超類,叫它Entity,並且Entity有一個object_type字段,描述我們有什麼類型的Entity。所有類型都具有相同的字段,但每種類型的行爲稍有不同。例如,對於不同的Entity類型,add方法是不同的。

我目前的解決方案是子類Entity每當我取一個Entity(例如,在find()where(..)),我請entity = entity.becomes(eval("Entity#{entity.object_type}"))。這很難看,並且效果不好,例如url_forform_for將調用未定義的方法,因爲類類型爲Entity<Type>,而不是Entity

我該如何去做一個沒有表繼承的模型繼承,例如url,路徑,表單和其他所有東西仍然按照描述工作?也許有一種方法可以讓我避免撥打.becomes(..)?我所做的很醜陋;)。

回答

1

我已經瞭解了更多關於Ruby和Rails的知識,並且我提出了一個很好的解決方案。我將Entity<Type>類更改爲模塊,並將它們放入lib/。然後,在實體類中,我有一個after_initialize回調,看起來像這樣:

if object_type == "Type1" 
    extend EntityType1 
elsif object_type == "Type2" 
    extend EntityType2 
end 

這樣,在EntityType1EntityType2定義的所有方法中Entity類的範圍執行,而不需要任何新的類實例。到目前爲止,解決方案一直運行良好,儘管我現在只用了幾天。