Tak, mam następujące:STI w Railsach: Jak zmienić nadklasę w podklasę bez bezpośredniego dostępu do atrybutu "type"?
class Product < ActiveRecord::Base
# Has a bunch of common stuff about assembly hierarchy, etc
end
class SpecializedProduct < Product
# Has some special stuff that a "Product" can not do!
end
Jest to proces produkcji i montażu, w którym dane są przechwytywane o produktach. W momencie wychwytywania ostateczny rodzaj produktu nie jest znany. po utworzeniu rekordu produktu w bazie danych (być może kilka dni później) może być konieczne przekształcenie tego produktu w specjalistyczny produkt i uzupełnienie dodatkowych informacji. Jednak nie wszystkie produkty staną się wyspecjalizowane.
Próbowałem użyć następujących czynności:
object_to_change = Product.find(params[:id])
object_to_change.becomes SpecializedProduct
object_to_change.save
Potem, kiedy robię SpecializedProduct.all
otrzymany zestaw nie zawiera object_to_change
. Zamiast object_to_change
nadal figuruje w bazie danych jako Product
UPDATE "products" SET "type" = ?, "updated_at" = ? WHERE "products"."type" IN ('SpecializedProduct') AND "products"."id" = 30 [["type", "Product"], ["updated_at", Fri, 17 May 2013 10:28:06 UTC +00:00]]
Więc po wywołaniu .becomes SpecializedProduct
metoda .save
jest teraz przy użyciu odpowiedniego typu, ale nie jest w stanie zaktualizować rekord, ponieważ klauzula aktualizacji WHERE
jest zbyt szczegółowe.
Czy naprawdę muszę uzyskać bezpośredni dostęp do atrybutu modelu type
? Wolałbym nie.
krótka odpowiedź: tak, musisz zaktualizować ją za pomocą typu. Ogólnie rzecz biorąc, STI nie jest przeznaczony do zmiany klas w czasie. –