Also, ich habe folgendes:STI in Rails: Wie kann ich von einer Oberklasse zu einer Unterklasse wechseln, ohne direkt auf das Attribut "type" zuzugreifen?
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
Es gibt eine Fertigungs- und Montageverfahren, bei dem Daten über Produkte erfasst wird. Zum Zeitpunkt der Erfassung ist der eventuelle Produkttyp nicht bekannt. Nachdem der Produktdatensatz in der Datenbank erstellt wurde (vielleicht einige Tage später), kann es notwendig sein, das Produkt in ein spezielles Produkt umzuwandeln und die zusätzlichen Informationen einzugeben. Nicht alle Produkte werden sich jedoch spezialisieren.
Ich habe versucht, die folgenden zu verwenden:
object_to_change = Product.find(params[:id])
object_to_change.becomes SpecializedProduct
object_to_change.save
Dann, wenn ich eine SpecializedProduct.all
die resultierende Menge tun nicht enthalten object_to_change
. Stattdessen wird object_to_change
noch in der Datenbank als 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]]
Also, nach dem Aufruf von .becomes SpecializedProduct
die .save
Methode jetzt der richtige Art verwendet, aber es ist nicht in der Lage, den Datensatz zu aktualisieren, da die WHERE
Klausel des Updates zu spezifisch.
Muss ich wirklich auf das type
Attribut des Modells direkt zugreifen? Ich würde es wirklich nicht tun.
kurze Antwort: Ja, Sie müssen es mit Typ aktualisieren. Im Allgemeinen ist STI nicht dafür ausgelegt, Klassen im Laufe der Zeit zu ändern. –