我有一些这样的 STI 设置:
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
现在我想复制并将其LinkedDocument
存储为OriginalDocument
具有自己的名称的 ,并保留重复的属性值。但是,我的方法失败了,因为在某个地方,副本仍然希望在 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
这会抛出一个RuntimeError: LinkedDocument#description delegated to original_document.description, but original_document is nil
.
由于保存查询涉及类型,因此执行附加copy.type = 'OriginalDocument'
操作是行不通的;UPDATE documents SET [...] WHERE documents.type IN('OriginalDocument') [...]
. 这失败了,因为在交易时,对象仍然是 type LinkedDocument
。
什么是复制对象并让它成为另一个对象的干净方法?我想调用和我想复制的每个属性,但在这样做之前,我想在这里问一下 update_column
。type