2017-07-27 103 views
0

我有一個設立在那裏我有多個型號,從基本型繼承 - 標準的單表繼承:在STI表/建模模式中,如何具有由所有類型共享的類型特定屬性?

class Parent < ActiveRecord::Base 
end 

class A < Parent 
end 

class B < Parent 
end 

我STI的設置是正確的,偉大工程!但是,我想添加:鍵入特定的屬性,如描述。

例如,我希望所有的A型父母的有描述,「我是A型家長。我的作用是...」

我想避免一遍又一遍地(複製數據讓A的每個實例存儲相同的描述)。

首先想到的就是在子類上有一個特定於模型的方法。因此,像:

class A < Parent 

    def self.description 
    "I am the A type of Parent. My function is for..." 
    end 

end 

我不喜歡這樣的解決方案,因爲這真的是數據上的特定類型的子類(而不是在子類的實例本身)的,你會得到所有的配備使這種行爲的問題(部署來改變數據等)

這是唯一的方法來做到這一點,或者是否有替代品我只是沒有看到?

回答

0

如何爲描述創建模型?

class Description < ActiveRecord::Base 
    has_many :as 
end 

class A < Parent 
    belongs_to :description 

    before_save { description_id = 1 } 
end 

這樣,你管理的description在數據庫中的內容,並能通過一個Web界面或遷移修改。此外,您可以輕鬆地爲不同的子類添加不同的描述,甚至可以根據需要爲每個實例更改它們。

此方法的一個缺點是您需要使用正確的描述創建模型。一個可能的解決方案可能是before_savebefore_create掛鉤,但我相信這不是唯一的方法。

+0

這是能夠解決我的顧慮一個夢幻般的方式。我相信有必要使before_save函數更具動態性(對於id沒有硬編碼值),但這個想法是一樣的!非常感謝你。要保持這個問題的公開以徵求更多潛在的想法,但你已經解決了這個問題。 –

+0

@LewaaBahmad很高興聽到這個消息。請將代碼作爲思考的食物,而不是實際的實施。硬編碼「id」感覺非常噁心。 :D – jdno

+0

絕對是哦。儘管我很欣賞,但您已經以非常純粹的方式呈現了這個概念。當我飆升時,我會與你分享我的實施。 –

0

你的情況下,我更喜歡使用紅寶石鴨打字如下

class ParentAll 
    def talk(object1) 
    object1.talk 
    end 
end 

class A < ParentAll 
    def talk 
    puts 'I am the A type of Parent. My function is for...' 
    end 
end 

class B < ParentAll 
    def talk 
    puts 'I am the B type of Parent. My function is for...' 
    end 
end 

@parent = ParentAll.new 
puts 'Using the A' 
@parent.talk(A.new) 
    # this will output talk from A 

puts 'Using the B' 
@parent.talk(B.new) 
    # this will output talk from B 
+0

是的,那是我的第一個衝動。但是,這意味着要更新數據,我必須更新方法,因此更新子類 - 我不想這樣做。談話行爲應該獨立於消息的內容,我應該能夠更新消息而無需重新部署應用程序。謝謝你! –

相關問題