Così, ho il seguente:STI in Rails: come passare da una superclasse a una sottoclasse senza accedere direttamente all'attributo "tipo"?
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
C'è un processo di fabbricazione e di assemblaggio in cui i dati vengono catturati su Prodotti. Al momento della cattura, l'eventuale tipo di prodotto non è noto. dopo che il record del Prodotto è stato creato nel database (forse alcuni giorni dopo) potrebbe essere necessario trasformare quel prodotto in un prodotto specializzato e inserire le informazioni aggiuntive. Tuttavia, non tutti i prodotti diventeranno specializzati.
Ho cercato di utilizzare il seguente:
object_to_change = Product.find(params[:id])
object_to_change.becomes SpecializedProduct
object_to_change.save
Poi, quando faccio una SpecializedProduct.all
l'insieme risultante non include object_to_change
. Invece object_to_change
è ancora elencato nel database come 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]]
Così, dopo la chiamata al .becomes SpecializedProduct
il metodo .save
ora sta usando il tipo giusto, ma non è in grado di aggiornare il record perché la clausola WHERE
dell'aggiornamento è troppo specifico
Devo davvero accedere direttamente all'attributo type
del modello? Preferirei davvero di no.
risposta breve: sì, è necessario aggiornarlo con il tipo. In generale, STI non è progettato per cambiare classe nel tempo. –