Odpowiedz

-2

Utwórz nową instancję B do ustawiania wartości dla atrybutów, które dzieli z A.

coś takiego:

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

To nie jest casting ... czy to prawda? – RubyDubee

+0

@Webbisshh Nie, nie jest. Jest to przybliżenie konkretnego problemu postawionego w pytaniu. – bjg

+2

'staje się' jest zaimplementowane w ten sposób, z tym że kopiuje więcej niż tylko atrybuty. Zobacz http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-becomes i zobacz kod źródłowy. –

5

Nie ma potrzeby rzucać od Ruby nie wykonuje żadnej świadectwo badania typu sprawdzanie w czasie kompilacji. Co próbujesz osiągnąć?

Załóżmy, że masz klasę Dad oraz klasy podrzędne Son i Daughter.

Można po prostu mieć zmienną @dad i przechowywać w niej obiekt Son lub Daughter i traktować go tak, jakby był to Dad. Dopóki reagują na te same metody, nie ma to znaczenia. Jest to koncepcja nazywana "pisaniem kaczym".

+3

Nie pamiętam dokładnie, dlaczego zrobiłem to pytanie, ale jeśli Dobrze pamiętam, że jest to potrzebne, gdy masz powiązanie STI ze stowarzyszeniem polimorficznym, lub jest ono zapisane z niewłaściwym polem 'type'. – fotanus

+0

Ruby nie ma jednak Railsów https://github.com/rails/rails/blob/1d08b98055508d00844cd30cbb68a4afa38a77a1/activerecord/lib/active_record/errors.rb#L14 –

Powiązane problemy