Respuesta

-2

Crear una nueva instancia de B para establecer los valores para los atributos que comparte con A.

Algo así como:

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

Esto no está emitiendo ... ¿verdad? – RubyDubee

+0

@Webbisshh No, no lo es. Esta es una aproximación para el problema particular planteado en la pregunta. – bjg

+2

'becomes' se implementa de esta manera, excepto que copia más que solo los atributos. Consulte http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-becomes y vea el código fuente. –

5

No debería ser necesario para emitir desde Ruby no realiza ningún tipo- comprobando en tiempo de compilación. ¿Qué está tratando de lograr?

Digamos que tiene una clase Dad, y clases de niños Son y Daughter.

Puede tener una variable @dad y almacenar en ella un objeto Son o Daughter, y simplemente tratarlo como si fuera un Dad. Siempre y cuando respondan a los mismos métodos, no hay diferencia. Este es un concepto llamado "pato escribiendo".

+3

No recuerdo exactamente por qué hice esta pregunta, pero si Recuerdo bien que es necesario cuando tienes una relación de ITS con una asociación polimórfica, o de lo contrario se guarda con el campo "tipo" incorrecto. – fotanus

+0

Ruby no lo hace, sin embargo, Rails hace https://github.com/rails/rails/blob/1d08b98055508d00844cd30cbb68a4afa38a77a1/activerecord/lib/active_record/errors.rb#L14 –

Cuestiones relacionadas