Attualmente sto utilizzando l'ereditarietà di tabelle singole di ActiveRecord.Come trasmettere un oggetto ActiveRecord a un'altra classe quando si utilizza STI?
Come posso trasmettere uno dei miei modelli da tipo A a B? Hanno lo stesso genitore.
Attualmente sto utilizzando l'ereditarietà di tabelle singole di ActiveRecord.Come trasmettere un oggetto ActiveRecord a un'altra classe quando si utilizza STI?
Come posso trasmettere uno dei miei modelli da tipo A a B? Hanno lo stesso genitore.
#becomes
è quello che state cercando:
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-becomes
Sembra che diventa è ora deprecato. Sapete se esiste un metodo che può prendere il suo posto - http://apidock.com/rails/ActiveRecord/Base/becomes – NatGordon
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method- i-diventa non deprecato, appena spostato. –
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)
Questo non è un casting ... vero? – RubyDubee
@ Webbisshh No, non lo è. Questa è un'approssimazione per il particolare problema posto nella domanda. – bjg
'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. –
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".
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
Ruby, tuttavia, non fa Rails https://github.com/rails/rails/blob/1d08b98055508d00844cd30cbb68a4afa38a77a1/activerecord/lib/active_record/errors.rb#L14 –
Non ci dovrebbe essere bisogno di lanciare. – RubyDubee