2013-07-18 53 views
0

讓說,我有模型有沒有辦法對象轉換到另一個類的紅寶石

User < ActiveRecord::Base 
end 

和他的STI兄弟

MasqueradeUser < User 
end 

masquerade_user = MasqueradeUser.find 123 
masquerade_user.class 
# => MasqueradeUser 

荒謬的,因爲它聽起來,可能這個對象轉換回父類User

masquerade_user.some_magic.class # => User 

我知道我可以重寫喜歡方法,is_a?(User)等,使MasqueradeUser將返回像User

MasqueradeUser < User 
    def model_name 
    'User' 
    end 
end 

我只是想知道,如果有一種方法可以徹底降級對象的父類的實例

+0

MasqueradeUser.superclass.name –

+0

你可以使用'model_name.superclass.name =='User''或'model_name.ancestors.include? 「用戶」'。如果不是,也許你不應該使用STI。 –

+0

thx球員,但我不需要在我的代碼中實現比較/條件,我需要欺騙其他另一個gem,我的對象是不同的克拉斯。在Yehuda Zargarov答案中的解決方案(我會接受的,只是等待是否有人知道任何本地Ruby解決方案) – equivalent8

回答

5

您可以使用ActiveRecordbecomes函數值 - 見here

+1

完美的作品,正如我所需要的,但你知道如果有任何構建紅寶石解決方案嗎? – equivalent8

+0

盡我所知,這是做到這一點的唯一方法。 –

+0

''成爲''已被棄用,你現在應該使用'成爲'現在(而這是同樣的事情,只是一個重命名)。請參閱http://apidock.com/rails/ActiveRecord/Persistence/becomes。 +1無論如何;) –

0

可以泛化ActiveRecordbecomes方法,例如:

def becomes(klass) 
    became = klass.new 
    became.instance_variable_set("@attributes", @attributes) 
    became 
end 

畢竟它只是一個複製變量到支持他們另一個對象的物質(即:它可以‘變成’任何類,不只是超類)