risposta

-2

Creare una nuova istanza di B per impostare i valori per gli attributi che condivide con A.

Qualcosa di simile:

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

Questo non è un casting ... vero? – RubyDubee

+0

@ Webbisshh No, non lo è. Questa è un'approssimazione per il particolare problema posto nella domanda. – bjg

+2

'diventa' è implementato in questo modo tranne che copia più degli attributi. Vedi http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-becomes e visualizza il codice sorgente. –

5

Non dovrebbe essere necessario per lanciare poiché Ruby non esegue alcun tipo- verifica al momento della compilazione. Cosa stai cercando di realizzare?

Supponiamo di avere una classe Dad e classi figlio Son e Daughter.

Si potrebbe semplicemente avere una variabile @dad e memorizzare in esso un oggetto Son o Daughter e trattarlo come se fosse un Dad. Finché rispondono agli stessi metodi, non fa differenza. Questo è un concetto chiamato "duck typing".

+3

Non ricordo esattamente perché ho fatto questa domanda, ma se Ricordo bene che è necessario quando si ha una relazione STI con un'associazione polimorfica, oppure viene salvata con il campo 'type' sbagliato. – fotanus

+0

Ruby, tuttavia, non fa Rails https://github.com/rails/rails/blob/1d08b98055508d00844cd30cbb68a4afa38a77a1/activerecord/lib/active_record/errors.rb#L14 –