回答

-2

創建B的一個新的實例,爲它與A

喜歡的東西分享屬性設置值:

class C < ActiveRecord::Base 
end 

class A < C 
end 

class B < C 
end 

@a = A.new(...) 
@b = B.new(@a.attr1, @a.attr2, ..., @a.attrN) 
+3

這不是鑄造......是嗎? – RubyDubee 2010-08-06 22:19:32

+0

@Webbisshh不,不是。這是問題中提出的特定問題的近似值。 – bjg 2010-08-06 23:51:19

+2

'成爲'是這樣實現的,只是它複製的不僅僅是屬性。請參閱http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-becomes並查看源代碼。 – 2013-06-04 19:44:43

5

你不應該需要轉換,因爲Ruby沒有執行任何類型 - 在編譯時檢查。你想達到什麼目的?

假設您有一個班級Dad和子類SonDaughter

您可以只有一個變量@dad,並在其中存儲一個SonDaughter對象,並將其視作爲Dad。只要他們對相同的方法做出迴應,它就沒有區別。這是一個名爲「鴨子打字」的概念。

+3

我不記得爲什麼我這樣做的問題,但如果我記得當你與多態關聯有STI關係時需要它,否則它會被保存在錯誤的'type'字段中。 – fotanus 2014-02-24 16:16:27

+0

但是,Ruby不支持Rails https://github.com/rails/rails/blob/1d08b98055508d00844cd30cbb68a4afa38a77a1/activerecord/lib/active_record/errors.rb#L14 – 2018-02-15 14:23:48

相關問題