Répondre

-2

Créer une nouvelle instance de B pour définir les valeurs des attributs qu'il partage avec A.

Quelque chose comme:

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

Ce n'est pas un casting ... n'est-ce pas? – RubyDubee

+0

@Webbisshh Non, ce n'est pas le cas. C'est une approximation pour le problème particulier posé dans la question. – bjg

+2

'devient' est implémenté comme ceci, sauf qu'il copie plus que les attributs. Voir http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-becomes et voir le code source. –

5

Vous ne devriez pas avoir à lancer depuis Ruby ne fonctionne pas type- vérification à la compilation. Qu'est-ce que vous essayez d'accomplir? Dites que vous avez une classe Dad et les classes Son et Daughter.

Vous pouvez simplement avoir une variable @dad et y stocker un objet Son ou Daughter, et le traiter comme s'il s'agissait d'un Dad. Tant qu'ils répondent aux mêmes méthodes, cela ne fait aucune différence. C'est un concept appelé "typage du canard".

+3

Je ne me souviens pas exactement pourquoi j'ai fait cette question, mais si Je me souviens bien que c'est nécessaire quand vous avez une relation STI avec une association polymorphe, ou bien elle est sauvegardée avec le mauvais champ 'type'. – fotanus

+0

Ruby ne fait pas, cependant, Rails https://github.com/rails/rails/blob/1d08b98055508d00844cd30cbb68a4afa38a77a1/activerecord/lib/active_record/errors.rb#L14 –