j'ai une certaine configuration STI comme ceci:STI, délégué et devient
class Document < ActiveRecord::Base
attr_accessible :name, description
# Basic stuff omitted
end
class OriginalDocument < Document
has_many :linked_documents, foreign_key: :original_document_id, dependent: :destroy
end
class LinkedDocument < Document
belongs_to :original_document
# Delegation, because it has the same attributes, except the name
delegate :description, to: :original_document
end
Maintenant, je veux dup le LinkedDocument
et le stocker comme OriginalDocument
, avec son propre nom et conserver les valeurs d'attributs de duplication. Cependant, mes approches échouent car quelque part, le duplicata veut toujours accéder à ses méthodes déléguées dans les callbacks after_ *.
class LinkedDocument < Document
def unlink_from_parent
original = self.original_document
copy = self.becomes OriginalDocument
copy.original_document_id = nil
copy.description = original.description
copy.save
end
end
Ceci déclenche un RuntimeError: LinkedDocument#description delegated to original_document.description, but original_document is nil
.
L'exécution d'un copy.type = 'OriginalDocument'
supplémentaire pour appliquer des éléments ne fonctionnera pas, car la requête de sauvegarde implique le type; UPDATE documents SET [...] WHERE documents.type IN('OriginalDocument') [...]
. Cela échoue, car au moment de la transaction, l'objet est toujours de type LinkedDocument
.
Ce qui serait une manière propre de copier un objet et de le laisser devenir un autre? J'ai pensé à appeler update_column
pour type
et tous les attributs que je veux copier, mais avant de le faire de manière si inélégante, je voulais demander ici.