Aktualnie używam dziedziczenia pojedynczej tabeli ActiveRecord.Jak rzutować obiekt ActiveRecord na inną klasę przy użyciu STI?
Jak mogę rzucić jeden z moich modeli od typu A do B? Mają tego samego rodzica.
Aktualnie używam dziedziczenia pojedynczej tabeli ActiveRecord.Jak rzutować obiekt ActiveRecord na inną klasę przy użyciu STI?
Jak mogę rzucić jeden z moich modeli od typu A do B? Mają tego samego rodzica.
#becomes
jest to, czego szukasz:
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-becomes
Wygląda na to, że staje się przestarzałe. Czy wiesz, czy istnieje metoda, która może zająć jego miejsce - http://apidock.com/rails/ActiveRecord/Base/becomes – NatGordon
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method- i-nie staje się przestarzałe, po prostu przeniesione. –
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)
To nie jest casting ... czy to prawda? – RubyDubee
@Webbisshh Nie, nie jest. Jest to przybliżenie konkretnego problemu postawionego w pytaniu. – bjg
'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. –
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".
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
Ruby nie ma jednak Railsów https://github.com/rails/rails/blob/1d08b98055508d00844cd30cbb68a4afa38a77a1/activerecord/lib/active_record/errors.rb#L14 –
Nie ma potrzeby, aby rzucić. – RubyDubee