Actualmente estoy usando la herencia de tabla única de ActiveRecord.¿Cómo convertir un objeto ActiveRecord a otra clase cuando se usa STI?
¿Cómo puedo transmitir uno de mis modelos del tipo A al B? Ellos tienen el mismo padre.
Actualmente estoy usando la herencia de tabla única de ActiveRecord.¿Cómo convertir un objeto ActiveRecord a otra clase cuando se usa STI?
¿Cómo puedo transmitir uno de mis modelos del tipo A al B? Ellos tienen el mismo padre.
#becomes
es lo que busca:
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-becomes
Parece que se convierte ahora está en desuso. ¿Sabes si hay un método que puede tomar su lugar? Http://apidock.com/rails/ActiveRecord/Base/becomes – NatGordon
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method- i-no se vuelve obsoleto, solo se mueve. –
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)
Esto no está emitiendo ... ¿verdad? – RubyDubee
@Webbisshh No, no lo es. Esta es una aproximación para el problema particular planteado en la pregunta. – bjg
'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. –
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".
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
Ruby no lo hace, sin embargo, Rails hace https://github.com/rails/rails/blob/1d08b98055508d00844cd30cbb68a4afa38a77a1/activerecord/lib/active_record/errors.rb#L14 –
No debería haber ninguna necesidad de emitir. – RubyDubee