J'utilise actuellement l'héritage de table unique ActiveRecord.Comment convertir un objet ActiveRecord en une autre classe lors de l'utilisation de STI?
Comment puis-je convertir un de mes modèles de type A en B? Ils ont le même parent.
J'utilise actuellement l'héritage de table unique ActiveRecord.Comment convertir un objet ActiveRecord en une autre classe lors de l'utilisation de STI?
Comment puis-je convertir un de mes modèles de type A en B? Ils ont le même parent.
#becomes
est ce que vous cherchez:
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-becomes
Il semble que devient est maintenant obsolète. Savez-vous s'il y a une méthode qui peut prendre sa place - http://apidock.com/rails/ActiveRecord/Base/becomes – NatGordon
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method- Je-ne deviens pas obsolète, juste déplacé. –
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)
Ce n'est pas un casting ... n'est-ce pas? – RubyDubee
@Webbisshh Non, ce n'est pas le cas. C'est une approximation pour le problème particulier posé dans la question. – bjg
'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. –
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".
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
Ruby ne fait pas, cependant, Rails https://github.com/rails/rails/blob/1d08b98055508d00844cd30cbb68a4afa38a77a1/activerecord/lib/active_record/errors.rb#L14 –
Il ne devrait pas être nécessaire de jeter. – RubyDubee